C#Sort Datagridview

时间:2016-03-18 13:52:29

标签: c# sorting datagridview

我想在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);
    }

有人可以解释一下吗?

1 个答案:

答案 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?

我希望这有助于清理它至少一点。