2017-12-05 1 views
0

Ich möchte DataGridVeiw alle 10 Sekunden aktualisieren. Nach dem Update werden neue Zeilen hinzugefügt und ich möchte DataGridView vor dem Update bereinigen. Das Problem ist, dass, wenn ich innerhalb von OnCallBack()dataGridView2.Rows.Clear(); und dataGridView2.Refresh(); rufe ich bekomme "Cross-Thread-Betrieb nicht gültig" Ausnahme.So löschen Sie Datagridview mit Timer?

Ich habe versucht, es aufzurufen, aber es hilft nicht.

if(dataGridView2.InvokeRequired){ 
     dataGridView2.Invoke(new MethodInvoker(delegate{ 
     dataGridView2.Rows.Clear(); 
     dataGridView2.Refresh(); 
})); 

Mein Code:

private void Live(){ 
     timer = new System.Threading.Timer (_ => OnCallBack(), null, 1000,Timeout.Infinite); 
    } 

    private void OnCallBack() 
    { 
     timer.Dispose(); 
     counter--; 

     label8.Text = counter.ToString();   
     if (counter == 0){ 
       string[] pr = {"124"}; 
       search.SearchLive(pr, dataGridView2, label10); 
       counter = 10; 
     } 
     timer = new System.Threading.Timer (_ => OnCallBack(), null, 1000,Timeout.Infinite); 
    } 

Antwort

0

Sie System.Timers Klasse einen neuen Timer erstellen zusammen mit seinem Intervall

System.Timers.Timer timer1 = new System.Timers.Timer(); 
timer1.Interval = 1000; //time after which you want to clear datagrid 
timer1.Start(); 
timer1.Elapsed += TimerTick; 

Dann erstellen Sie einen Ereignishandler für TimerTick

verwenden können
private void TimerTick(object sender, ElapsedEventArgs e) 
{ 
    if (dataGridView1.rows.count>0) 
    { 
    dataGridView1.Rows.Clear(); 
    dataGridView1.Refresh(); 
    } 
} 

Fügen Sie diesen Check hinzu, wenn yo Sie möchten weitere Cross-Threading-Ausnahmen verhindern

CheckForIllegalCrossThreadCalls = false; 
0

Sie können UI-Komponenten nur über den UI-Thread aufrufen. Die Threading.Timer führt den Rückruf für einen Thread aus dem Threadpool und nicht den UI-Thread aus, der Ihre Ausnahme verursacht. Es gibt jedoch Möglichkeiten, den Funktionsaufruf an den UI-Thread zu senden.

Versand nach Ihrem Anruf an den UI-Thread

meist UI-Frameworks Gewinde völlig alleinstehend sind. Es ist nicht möglich, auf eine Komponente aus einem anderen Thread als dem UI-Thread zuzugreifen.

Sie müssen zum aktuellen UI-Thread senden. Wenn Sie Ihre Steuerelementnamen betrachten, sieht es entweder wie eine WinForms- oder eine WPF-Anwendung aus.

In WinForms müssen Sie den folgenden Code zurück an den UI-Thread versenden:

public void UpdateUI(object parameter) 
{ 
    if (this.InvokeRequired) 
    { 
     Dispatcher.BeginInvoke(new Action(() => UpdateUI(parameter))); 
     return; 
    } 

    // Update or access here 
} 

In WPF die snipped folgenden können Sie die ui ändern, um einen anderen Thread bilden:

public void UpdateUI(object parameter) 
{ 
    if (!Dispatcher.CheckAccess()) 
    { 
     Dispatcher.BeginInvoke(new Action(() => UpdateUI(parameter))); 
     return; 
    } 

    // Do update or access here 
} 

Die Wichtig dabei ist, dass diese Funktionen im UI-Thread und nicht im aufrufenden Thread ausgeführt werden.

Bearbeiten: Der Objektparameter ist vollständig optional. Es war als ein Beispiel dafür gedacht, wie diese Methode mit einer Funktion mit Parametern verwendet werden kann.

System.Timers.Timer Mit

Sie auch die System.Timers.Timer verwenden könnte, die in den Timer in System.Threading.Timer ganz ähnlich funktioniert, aber wird den Rückruf auf dem UI-Thread ausgeführt werden.

Verwandte Themen