C# Winforms - 未绑定 DataGridView 的辅助排序

本文关键字:排序 DataGridView 绑定 Winforms | 更新日期: 2023-09-27 18:31:49

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

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

姓名/状态

E/X

C/X

A/X

B/Y

D/Y

我正在尝试让状态列按字母顺序排序,对名称进行辅助(始终升序)排序。这是预期结果(状态升序):

姓名/状态

A/X

C/X

E/X

B/Y

D/Y

或状态降序

姓名/状态

B/Y

D/Y

A/X

C/X

E/X

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

欣赏任何想法或线索!

C# Winforms - 未绑定 DataGridView 的辅助排序

更新:我误读了你的问题,认为你想要一个"稳定"的排序。为此,您需要以一种或另一种方式使用 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;
    }
}

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

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

要使排序起作用,您需要在某处设置每列的SortMode

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

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

我不太了解 datagridview。

但能够在微软中看到一个规范,比如有一个用于排序方法的 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