【问题标题】:Custom Sorting on a DataGridViewDataGridView 上的自定义排序
【发布时间】:2010-11-25 16:03:00
【问题描述】:

我在 SO 上发现了一些与这里类似的问题,但没有一个与这个问题相匹配,所以我们开始吧。

我有一个显示团队成员的 DataGridView。所有团队成员在其中一列中列出的团队中都有分配的角色。示例可能是“法定代表”、“客户经理”、“助理客户经理”或“会计师”。

这就是有趣的地方。我基本上想按字母顺序对这一列的网格进行排序,但有几个例外。 “客户经理”应始终列在顶部,然后是“助理客户经理”(如果有的话)。

此时对象和网格都可以运行,并且已经在生产版本中发布了一段时间,所以我不想在这方面做更多不必要的工作。

有没有简单的方法来做到这一点?我想我必须以编程方式进行......

一些伪代码需要澄清:

if (memberRole == 'Account Manager') 
{
    //put in top row
}
else if (memberRole == 'Assistant Account Manager')
{
    //put in second row 
}
else
{
    //sort remaining rows alphabetically
}

我使用 Visual Studio 2008 在 C# .NET 中工作。

【问题讨论】:

    标签: c# .net visual-studio-2008 sorting datagridview


    【解决方案1】:

    您可以捕获 datagridview 的 SortCompare 事件:

        private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
        {
            string cell1, cell2;
    
            if (e.Column == "Your_Column")
            {
                if (e.CellValue1 == null) cell1 = "";
                else cell1 = e.CellValue1.ToString();
    
                if (e.CellValue2 == null) cell2 = "";
                else cell2 = e.CellValue2.ToString();
    
                if (cell1 == "Account Manager") { e.SortResult = -1; e.Handled = true; }
                else
                {
                    if (cell2 == "Account Manager") { e.SortResult = 1; e.Handled = true; }
                    else
                    {
                        if (cell1 == "Assistant Account Manager") { e.SortResult = -1; e.Handled = true; }
                        else
                        {
                            if (cell2 == "Assistant Account Manager") { e.SortResult = 1; e.Handled = true; }
                        }
                    }
                }
            }
        }
    

    【讨论】:

    • 重要的是要注意,上述方法仅在"Account Manager""Assistant Account Manager" 各最多有一个时有效,因为如果其中有两个或多个,它们可以进行比较彼此多次但顺序不同,这对于比较函数来说是非法行为(即,每次调用时它都会对这对元素进行不同的排序)
    【解决方案2】:

    或者在从服务器端获取数据时,您可以对其进行排序,然后通过 w/e json 等将其传递到前端,这样列表所做的就是显示数据,并且数据在服务器上进行了排序

    【讨论】:

    • 我有点不确定你在这里建议什么。如果你建议我在服务器端实现一些不是一个选项的东西,不幸的是。服务器端解决方案是坚如磐石的不可更改的解决方案(就像 20 年前在 KOBOL 中制造的),我们必须照原样使用。
    【解决方案3】:

    另一个可能不吸引某些人但可以快速实施且效果很好的解决方案是在对象上引入一个新属性以用于排序目的。使新属性包含一个排序字符作为第一个字符(一个数字效果很好),并将实际排序值作为其余字符。实现一些简单的 if-else 语句来设置排序属性的适当值。

    将此列添加到网格时,只需将其隐藏并按该列排序即可。

    可能不如 najmeddine 提出的解决方案那么优雅,但它确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-12
      • 2010-09-30
      • 1970-01-01
      • 2016-03-22
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      相关资源
      最近更新 更多