繁体   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