1

「検索」というボタンをクリックすると入力されていた dataTable があります。このクリックで、dataTable にデータが入力されます。dataTable データで更新する新しいスレッドを作成しています。しかし、ユーザーは再び検索ボタンをクリックしました。スレッドが既にその dataTable を更新している間に、その dataTable が再び新しいデータで満たされるようになりました。[検索] をクリックすると、コードが再び新しいスレッドを作成し、変更された dataTable の更新を開始します。ここで、次のようなエラーが発生しています: クロススレッド操作が無効です: コントロール '' が作成されたスレッド以外のスレッドからアクセスされました。解決策を提案してください。ありがとう

4

2 に答える 2

0

検索ボタンを割り当てることができます

btn.Enabled = false;

それをクリックしてメソッドを呼び出すと、検索が終了すると再度有効になります

ボタンを無効にしたくない場合は、このコードを使用できます

private BackgroundWorker trd;

private void button1_Click(object sender, EventArgs e)
{
   if (trd != null)
   {
      trd.CancelAsync();
   }

   trd = new BackgroundWorker();
   trd.DoWork += new DoWorkEventHandler(trd_DoWork);
   trd.WorkerSupportsCancellation = true;
   trd.RunWorkerAsync();
}

public void trd_DoWork(object sender, DoWorkEventArgs e)
{
     // Your search code
}

そうすれば、スレッドを中止して再起動します。検索は途中で停止し、別のバックグラウンド ワーカーで値を編集しません。バックグラウンドワーカーは値を編集しています。これは、クロススレッドがないことを意味します。他のスレッドはわかりませんが、UI スレッドは UI を編集できます

于 2013-09-12T08:14:27.313 に答える