C#Winforms - 第二种未绑定的DataGridView

时间:2014-11-25 13:48:20

标签: c# winforms sorting datagridview

为蹩脚的"网格道歉" :(

我有一个包含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上的自动排序?)。

欣赏任何想法或潜在客户!

3 个答案:

答案 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