[英]C# Sort Datagridview
我想在我的DownloadFileCompleted event
結束時對我的Datagridview
進行排序。 我嘗試了以下源代碼,如果在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);
}
有人可以解釋我嗎?
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
類型。
可以在這里找到一個簡短的簡單答案: Invoke 在下面如何工作?
我希望這至少有助於清除它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.