1

有一个数据表,用于在单击“搜索”按钮时填充。当dataTable填满数据时点击这个。我正在创建一个在 dataTable 数据处更新的新线程。但用户再次点击搜索按钮。现在,当线程已经在更新该 dataTable 时,该 dataTable 再次填充了新数据。在搜索上单击代码再次创建一个新线程并开始更新更改的数据表。在这里我遇到错误:跨线程操作无效:控制''从创建它的线程以外的线程访问。请提出解决方案。谢谢

4

2 回答 2

2
  1. 检查您正在更新的控件上是否有 InvokeRequired,然后在必要时执行 Invoke 或 BeginInvoke
  2. 如果更新已在进行中,则禁用按钮和/或禁用新更新

用于更新 DataGridView 的数据源:

if(DGV.InvokeRequired)
DGV.Invoke(new EventHandler(delegate
{
     DGV.DataSource= currentDataTable;
}));
else DGV.DataSource= currentDataTable;

如果您从另一个线程更新并在那里设置 currentDataTable,也许您应该考虑创建一个事件,当您的更新完成(或工作完成 - 如果您使用的是 BackgroundWOrker)时将触发并更新您的 GUI - Invoke 赢了那就没有必要了。

于 2013-09-12T08:19:58.903 回答
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 回答