【问题标题】:DataGridView SortCompare event doesn't fireDataGridView SortCompare 事件不会触发
【发布时间】:2010-11-24 16:18:39
【问题描述】:

使用 VS2008、C# 和 .NET 3.5

我正在使用数据绑定 DataGridView 控件来显示从 Web 服务读取的表格数据。在某些情况下,有一个数字列需要排序。我尝试了几种不同的方法来让它工作,但该列仍然按字母顺序排序(即 1、10、2、3 而不是 1、2、3、10)。

将列数据类型设置为 int 不适用于数据绑定控件,因此唯一真正的方法是提供一些自定义排序逻辑。

许多人建议挂接到 SortCompare 事件以提供自定义排序逻辑,但由于某种原因,事件代码永远不会运行——我可以在处理程序中放置一个断点,但它永远不会到达那里。我是通过GUI添加事件处理程序,所以处理程序是通过VS添加到控件中的,而不是手动添加的。

这是事件处理程序代码,取自这里附近的某个地方:

    private void uxLicensedSoftwareDataGridView_SortCompare( object sender, 
                                          DataGridViewSortCompareEventArgs e )
    {
        int intValue1, intValue2;

        if ( !Int32.TryParse( e.CellValue1.ToString(), out intValue1 ) )
            return;
        if ( !Int32.TryParse( e.CellValue2.ToString(), out intValue2 ) )
            return;

        if ( intValue1 == intValue2 )
            e.SortResult = 0;
        else if ( intValue1 < intValue2 )
            e.SortResult = -1;
        else
            e.SortResult = 1;

        e.Handled = true;
    }

如果它被触发,它会完全按照我的意愿去做。我可能会错过什么?

感谢您指出(希望)显而易见的... 戴夫

【问题讨论】:

    标签: c# winforms events .net-3.5


    【解决方案1】:

    将每列的排序模式设置为“自动”而不是“程序化”

    也来自这个document

    当 DataSource 属性为 设置或当 VirtualMode 属性值为 true 时。

    【讨论】:

    • 谢谢。我在大约 10 秒前找到了您答案的第二部分,但是如果您使用 DataSource 属性,您应该如何进行自定义排序?对我来说,这听起来像是一个糟糕(或懒惰)的设计决定,但我想我不知道整个故事......
    【解决方案2】:

    DataGridView 数据绑定时,也可以对数据源进行排序。

    一些数据源内置了对排序的支持。您的数据源实现 IBindingList 或 IBindingListView 排序属性和方法,以各种方式对数据源进行排序。

    【讨论】:

    • 这行得通,我敢肯定。毕竟我最终不必对列进行排序(我只是不允许对列进行排序,这对最终用户来说是可以的),所以目前这不是问题。如果它成为一个问题,这将是解决问题的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多