有一个dataTable用来点击按钮填写“搜索”。在dataTable填充数据时单击此按钮。我正在创建一个新的线程,它在dataTable数据上更新。但是用户再次单击了搜索按钮。现在,当一个线程已经更新了dataTable时,dataTable再次填充了新数据。在搜索上单击代码再次创建一个新线程并开始更新已更改的dataTable。这里我遇到错误:跨线程操作无效:控制''从其创建的线程以外的线程访问。请提出解决方案。感谢
答案 0 :(得分:2)
用于更新DataGridView的DataSource:
if(DGV.InvokeRequired)
DGV.Invoke(new EventHandler(delegate
{
DGV.DataSource= currentDataTable;
}));
else DGV.DataSource= currentDataTable;
如果你正在从另一个线程更新并在那里设置currentDataTable,也许你应该考虑创建一个事件,当你的更新完成时,它将触发并更新你的GUI(或者你完成工作 - 如果你正在使用BackgroundWOrker) - 那时没有必要调用。
答案 1 :(得分: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