我想在Datagridview
结束时对DownloadFileCompleted event
进行排序。
我尝试使用以下来源,如果它在buttonClick event
上调用了,但它不在DownloadFileCompleted event
,我不明白为什么。
// Does work
private void bt_test_1_Click(object sender, EventArgs e)
{
dg_logiciel.Columns[1].SortMode = DataGridViewColumnSortMode.Programmatic;
dg_logiciel.Sort(dg_logiciel.Columns[1], ListSortDirection.Ascending);
}
// Does not work
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
// mycode
dg_logiciel.Columns[1].SortMode = DataGridViewColumnSortMode.Programmatic;
dg_logiciel.Sort(dg_logiciel.Columns[1], ListSortDirection.Ascending);
}
有人可以解释一下吗?
答案 0 :(得分:1)
dg_logiciel
未更新的原因是,client_DownloadFileCompleted
方法是异步调用您在后台下载的任何内容。这意味着client_DownloadFileCompleted
方法由与datagridview
所在的线程不同的线程调用。 datagridview
位于UI Thread
上,某些client_DownloadFileCompleted
正在调用Worker Thread
。
要解决此问题,您需要向UI Thread
发送一些内容,告诉它需要执行某种操作。
这可以通过调用<control>.Invoke(...)
完成,如下所示:
dg_logiciel.Invoke((MethodInvoker) delegate(){ dg_logiciel.Sort(dg_logiciel.Columns[1], ListSortDirectionAscending);});
这会向UI Thread
发送一条消息,告诉它在有机会时调用您正在通过的delegate
。在这种情况下,委托只有一个未命名的方法,并且该方法所做的就是调用dg_logiciel.Sort(...);
(MethodInvoker)
位,为了完整起见,只需将委托转换为MethodInvoker
类型。
可在此处找到简短的简单答案:How does Invoke work underneath?
我希望这有助于清理它至少一点。