2017-12-05 9 views
0

DataGridVeiwを10秒ごとに更新したい。これまでは更新後、新しい行が追加され、更新前にDataGridViewをクリーンアップする必要がありました。問題は、私がOnCallBack()dataGridView2.Rows.Clear();dataGridView2.Refresh();を呼び出すと「クロススレッド操作が無効です」という例外が発生するということです。タイマーを使用してDataGridviewをクリアするには?

私はそれを呼び出そうとしましたが、それは助けになりません。

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

マイコード:

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); 
    } 

答えて

0

あなたが次にTIMERTICK

のイベントハンドラを作成し、その間隔

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

と一緒に新しいタイマーを作成するために、System.Timersクラスを使用することができます

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

yoさらにクロススレッド例外を防止したい

CheckForIllegalCrossThreadCalls = false; 
0

UIコンポーネントからのみアクセスできます。 Threading.Timerは、UIスレッドではなく、スレッドプールからのスレッドでコールバックを実行し、例外を引き起こします。しかし、UIスレッドに関数呼び出しをディスパッチする方法があります。

ほとんどのUIフレームワークは完全に単一スレッド化されたUIスレッドにお電話を派遣します。 UIスレッドとは別のスレッドからコンポーネントにアクセスすることは許可されていません。

現在のUIスレッドにディスパッチする必要があります。コントロール名を見ると、WinFormsやWPFアプリケーションのように見えます。あなたはUIスレッドに戻って派遣するために、次のコードを必要とするのWinFormsで

:WPFで

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

    // Update or access here 
} 

次スニップは、あなたが別のスレッドを形成するUIを変更することができます:

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

    // Do update or access here 
} 

ここで注意すべき重要なことは、これらの関数がUIスレッドで実行され、呼び出しスレッドでは実行されないことです。

編集:オブジェクトパラメータは完全にオプションです。これは、このメソッドをパラメータを持つ関数とともに使用する方法の例として意図されています。あなたはまた、System.Threading.Timerでタイマーと非常に似働くSystem.Timers.Timerを、使用することができますが、UIスレッド上でコールバックを実行しますでSystem.Timers.Timer

を使用して

関連する問題