有一个数据表,用于在单击“搜索”按钮时填充。当dataTable填满数据时点击这个。我正在创建一个在 dataTable 数据处更新的新线程。但用户再次点击搜索按钮。现在,当线程已经在更新该 dataTable 时,该 dataTable 再次填充了新数据。在搜索上单击代码再次创建一个新线程并开始更新更改的数据表。在这里我遇到错误:跨线程操作无效:控制''从创建它的线程以外的线程访问。请提出解决方案。谢谢
问问题
1824 次
2 回答
2
- 检查您正在更新的控件上是否有 InvokeRequired,然后在必要时执行 Invoke 或 BeginInvoke
- 如果更新已在进行中,则禁用按钮和/或禁用新更新
用于更新 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 回答