2014-11-25 36 views
1

道歉瘸子看「網格」 :(C#的WinForms - 輔助排序未綁定的DataGridView的

我有2列(名稱和狀態),和自動排序的兩列未綁定的數據網格 的字母。在名稱排序按狀態排序時不能保持它可能看起來像這樣:

名稱/狀態

E/X

C/X

A/X

B/

d/Y

我試圖讓狀態列字母順序排序,輔助(始終爲ASCENDING)按姓名排序。這是預期的結果(狀態升序):

名稱/狀態

A/X

C/X

E/X

B/Y

D/Y

或狀態降序

名稱/狀態

乙/ Y

d/Y

A/X

C/X

E/X

我知道我可能需要以編程方式排序的狀態,但不知道如何實現它,也沒怎麼觸發它(不會覆蓋ColumnHeaderMouseClick禁用名稱上的自動排序?)。

感謝任何想法或線索!

+0

以及你嘗試過在'DataGridView.Sort方法簡單的谷歌搜索()'[DataGridView.Sort(HTTP:/ /msdn.microsoft.com/en-us/library/0868ft3z%28v=vs.110%29.aspx) – MethodMan 2014-11-25 13:53:08

+0

我做到了。結果主要涉及綁定數據源和/或按多列進行排序。在這裏發佈一個問題,因爲我認爲我的情況有點不同。謝謝。 – eranfu 2014-11-25 14:04:16

+0

不幸的是,.NET中的大多數類似於不穩定。然而,LINQ中的所有類型都是afaik,穩定的。因此,您可以將數據推入列表中,使用訂單並將其抽回。或者使用DataBinding ..或者你可以寫一個自定義的排序,但我相信LINQ的方式會更容易編碼.. – TaW 2014-11-25 14:18:32

回答

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排序列。我使用硬編碼的兩列名稱。

我使用變量order來糾正在降序排序時發生的不需要的反轉。

對於這類工作,你需要設置每列的SortMode地方:

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

看起來像這可以工作,謝謝! – eranfu 2014-11-26 14:21:54

1

排序操作不能在列上獨立工作。行中的數據保持其身份。