【问题标题】:C# Winforms - Secondary sort of unbound DataGridViewC# Winforms - 二级未绑定 DataGridView
【发布时间】:2025-12-05 11:55:01
【问题描述】:

为看起来蹩脚的“网格”道歉:(

我有一个包含 2 列(名称和状态)的未绑定数据网格,并且两列都自动排序。 按状态排序时,不保持名称的字母排序。它可能看起来像这样:

姓名/状态

E / X

C/X

A/X

B/Y

日/年

我试图让 Status 列按字母顺序排序,并在 Name 上进行次要(总是 ASCENDING)排序。这是预期的结果(状态升序):

姓名/状态

A/X

C/X

E / X

B/Y

日/年

或状态降序

姓名/状态

B/Y

日/年

A/X

C/X

E / X

我知道我可能需要以编程方式对 Status 进行排序,但不确定如何实现它,也不确定如何触发它(不会覆盖 ColumnHeaderMouseClick 禁用对 Name 的自动排序?)。

欣赏任何想法或线索!

【问题讨论】:

  • 你试过简单的谷歌搜索DataGridView.Sort Method()DataGridView.Sort
  • 我做到了。结果主要与绑定数据源和/或按多列排序有关。在这里发布了一个问题,因为我认为我的情况有点不同。谢谢。
  • 不幸的是,.NET 中的大多数排序似乎都不稳定。然而,LINQ 中的所有类型都是稳定的。因此,您可以将数据推送到列表中,使用订单并将其抽回。或者毕竟使用 DataBinding.. 或者您可以编写自定义排序,但我相信 LINQ 方式会更简单编码..
  • 请看我更正的答案。我以为你想要一个稳定的排序,但这更容易..

标签: c# winforms sorting datagridview


【解决方案1】:

更新:我误读了你的问题,并认为你想要一个“稳定”的排序。为此,您需要以一种或另一种方式使用 LINQ。

但您总是希望 Name 列按升序排序;这可以通过编码SortCompare 事件来完成,可能是这样的:

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
    if (e.CellValue1 == e.CellValue2)
    {
        int order = dataGridView1.SortOrder == SortOrder.Ascending ? 1 : -1;
        string altCol = "Name";
        if (e.Column.Name == "Name")  altCol = "Status";

        string s1 = dataGridView1[altCol, e.RowIndex1].Value.ToString();
        string s2 = dataGridView1[altCol, e.RowIndex2].Value.ToString();
        e.SortResult = String.Compare(s1, s2) * order;
        e.Handled = true;
    }
}

我测试以查看主排序列是否相等。只有这样我们才需要干预并切换到备用排序列。我使用硬编码的两个列名..

我使用变量 order 来更正降序排序时可能发生的不需要的反转。

为了使排序正常工作,您需要在某处设置每列的 SortMode

foreach (DataGridViewColumn col in dataGridView1.Columns) 
         col.SortMode = DataGridViewColumnSortMode.Automatic;

【讨论】:

    【解决方案2】:

    我不太了解datagridview。

    但能够在 microsoft 中看到规范,例如排序方法有 IComparer 重载

    http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.sort(v=vs.110).aspx

    我认为您可以通过实现接口以编程方式至少满足您的要求。

    查看示例

    http://msdn.microsoft.com/en-us/library/wstxtkxs%28v=vs.110%29.aspx

    【讨论】:

      【解决方案3】:

      排序操作不能在列上独立工作。行中的数据与其标识保持一致。

      【讨论】: