为看起来蹩脚的"网格":(道歉
我有一个包含 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 不会禁用对名称的自动排序吗?
欣赏任何想法或线索!
更新:我误读了你的问题,认为你想要一个"稳定"的排序。为此,您需要以一种或另一种方式使用 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