2015-07-10 27 views
0

我在datagridview中具有特定數字的字符串列。它沒有約束。我想正確分類。默認的DataGridView排序不會將其排序正確。如何將字符串排序爲DataGridView中的數字

例子: DGV排序,像這樣:

- FS 752/08/2014 
- FS 752/06/2015 
- FS 751/12/2013 
- FS 751/08/2014 
- FS 751/06/2015 

它應該是這樣的:

- FS 752/06/2015 
- FS 751/06/2015 
- FS 752/08/2014 
- FS 751/08/2014 
- FS 751/12/2013 

我怎樣才能做到這一點?

+3

嘗試製作一個特殊的'比較器',並在該比較器中使用'DataGridView.Sort'方法。示例:https://msdn.microsoft.com/en-us/library/wstxtkxs(v=vs.110).aspx – ASh

回答

2

正如你所說你沒有使用DataSource那麼你可以嘗試使用SortCompare event

當用戶單擊列更改排序順序或編程調用Sort function時,將會調用此事件。

這裏是一個基本的例子。我想提出的是要排序是一年的假設,然後每月再第一號(?)(?):

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) 
{ 

    // Check if we are sorting by the special column. 
    if (myDataGridView.Columns.Contains("My_Column") && e.Column == myDataGridView.Columns["My_Column"]) 
    { 

     // Parse the special values (add validation if required). 
     string[] parts1 = e.CellValue1.ToString().Trim().Split('/'); 
     int a1 = int.Parse(parts1[0].Split(' ')[2]); 
     int b1 = int.Parse(parts1[1]); 
     int c1 = int.Parse(parts1[2]); 
     string[] parts2 = e.CellValue2.ToString().Trim().Split('/'); 
     int a2 = int.Parse(parts2[0].Split(' ')[2]); 
     int b2 = int.Parse(parts2[1]); 
     int c2 = int.Parse(parts2[2]); 

     // Compare each value as required. 

     // First compare the last value (year?) 
     e.SortResult = c1.CompareTo(c2); 

     // If equal, then compare second value (month?) 
     if(e.SortResult == 0) 
      e.SortResult = b1.CompareTo(b2); 

     // Finally if still equal, then compare first value 
     if(e.SortResult == 0) 
      e.SortResult = a1.CompareTo(a2); 

    } 

} 

注意:如果你不能保證你將永遠有一個有效的格式,每一個細胞,那麼您將需要爲此事件添加驗證邏輯。例如,使用int.TryParse()並檢查null值,並驗證分割的長度。

+0

完美!我已經使用了這個解決方案,只需修改一下它就可以完美!我很高興,謝謝你:) – XardasLord

相關問題