为蹩脚的"网格道歉" :(
我有一个包含2列(名称和状态)的未绑定数据网格,并在两列上自动排序。 按状态排序时,不会保留名称上的字母排序。它可能看起来像这样:
姓名/状态
E / X
C / X
A / X
B / Y
D / Y
我试图让“状态”列按字母顺序排序,对“名称”进行二级(始终为ASCENDING)排序。这是预期的结果(状态升序):
姓名/状态
A / X
C / X
E / X
B / Y
D / Y
或状态降序
姓名/状态
B / Y
D / Y
A / X
C / X
E / X
我知道我可能需要以编程方式对Status进行排序,但不确定如何实现它,也不知道如何触发它(不会覆盖ColumnHeaderMouseClick,禁用Name上的自动排序?)。
欣赏任何想法或潜在客户!
答案 0 :(得分:1)
排序操作不会在列上独立工作。行中的数据保持其标识。
答案 1 :(得分: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;
}
}
我测试主要排序列是否相等。只有这样我们才需要干预并切换到altenate sort列。我用你的两个列名硬编码..
我使用变量order
来纠正降序排序中不必要的逆转。
要使排序正常工作,您需要在某处设置每个列的SortMode
:
foreach (DataGridViewColumn col in dataGridView1.Columns)
col.SortMode = DataGridViewColumnSortMode.Automatic;
答案 2 :(得分:0)
我不太了解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