簡體   English   中英

C# 排序 Datagridview

[英]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所在的線程不同的線程調用。 datagridviewUI 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM