2010-01-07 98 views
7

我正在使用一個簡單的DataGridView來保存一堆數據(有趣的是)。Winform DatagridView數字列排序

我在特定列中有小數。但是,當涉及到按小數列排序時,它會錯誤地命令它。例如:

發車順序可能是:

  • 0.56
  • 3.45
  • 500.89
  • 20078.90
  • 1.56
  • 100.29
  • 2.39

結局順序將是:

  • 0.56
  • 100.29
  • 1.56
  • 20078.90
  • 2.39
  • 3.45
  • 500.89

如你所見,它從第一個數字開始下令。然後以這種方式命令它。

我想我可能會將列設置爲不同的「ColumnType」,並可能自動執行此操作。但是沒有「數字」或「小數」列類型。

我在MSDN上查找問題,我可以找到「排序」方法,我可以在DataGridView上使用。但是這個解釋有些凌駕於我的頭上,而且這些例子並沒有使用數字,只有文字,所以我無法看到我應該如何切換。

任何幫助將不勝感激。

回答

7

您可以通過添加與下面的代碼在DataGridView的SortCompare事件的處理程序解決這個問題:

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) 
{ 
    if (e.Column.Index == 0) 
    { 
     if (double.Parse(e.CellValue1.ToString()) > double.Parse(e.CellValue2.ToString())) 
     { 
      e.SortResult = 1; 
     } 
     else if (double.Parse(e.CellValue1.ToString()) < double.Parse(e.CellValue2.ToString())) 
     { 
      e.SortResult = -1; 
     }    
     else 
     { 
      e.SortResult = 0; 
     } 
     e.Handled = true; 
    } 
} 

從MSDN存在SortResult值的這樣的描述:

小於零,如果所述第一小區將 第二CE之前進行排序二;如果第一個單元格和第二個單元格具有相同的值,則表示爲 ;如果第二個單元在第一個單元之前將被排序 ,那麼大於零 。

請注意,在我的測試牀上唯一的數字列是第一個(索引爲0),所以這就是爲什麼我有檢查列索引。

此外,根據您的需要和數據,您可能需要優化我的代碼 - 例如,如果您的列中存在非數字數據,我的代碼將拋出異常。

您可能已經看到它,但here是定製DataGridView排序的MSDN頁面的鏈接。正如你所說,他們只處理文本。

+0

哦,這個男人! 是的工作完美:)謝謝你! – MindingData 2010-01-07 06:41:13

+0

一直在努力,你的代碼工作,而我發現的其他人沒有。謝謝。 – user1500403 2015-08-05 00:05:58

0

它按字符排序。您需要使列類型爲float,以便知道要應用哪個比較運算符。

(也就是你需要列類型數據集中的浮動,我相信會奏效。)

+0

不使用數據綁定:)。 – MindingData 2010-01-07 06:34:13

+0

yikes!你如何獲得數據到網格? – Hogan 2010-01-07 14:34:49

+0

那麼...我有一個自定義結構的列表。它包含大約5個字符串元素。 因此,我可以使用forloop,遍歷列表,並將它們逐個添加到數據網格中。 通過網頁瀏覽做到這一點,並且在數據進入網格後不需要「保留」數據。沒有數據操作(除了排序:P),只是使用datagrid進行查看。 – MindingData 2010-01-07 22:21:47

0

你的問題是datagridview正在按字符串排序。嘗試將string複製到float,然後將該單元複製到datagrid

6

我有同樣的問題。我嘗試使用大衛霍爾提到的事件處理程序。定義DataGridView時我使用了ValueType屬性。現在排序雙打,沒有自定義事件處理程序代碼需要

dataGridView1.Columns[int index].ValueType = typeof(double); 

您也可以格式化使用

dataGridView2.Columns[int index].DefaultCellStyle.Format = string format; 
+0

非常好的建議,如果它能工作。然而,無論出於何種原因,對我而言這是行不通的。我在Debugger中檢查過它,ValueType確實是'Double',但實際上並沒有進行相應的排序。 – Yellow 2013-09-20 15:05:12

+0

@Yellow您可能想要檢查您是否正在執行'typeof(double)'而不是'typeof(Double)'。一個是類,另一個是變量類型。在使用類def Double時,我遇到了類似的問題。 – 2013-10-28 14:40:09

1

數值類型有一個內置的CompareTo功能之列,這可以作爲的SortResult SortCompare事件。

private void dataGridView_SortCompare(object sender, DataGridViewSortCompareEventArgs e) 
    { 
     if (e.Column.Index == 0) 
     { 
      e.SortResult = int.Parse(e.CellValue1.ToString()).CompareTo(int.Parse(e.CellValue2.ToString())); 
      e.Handled = true; 
     } 
    } 

這當然假設您知道放入DataGridView中的類型以開始。

1

您的數據庫列類型應該是int或double或float,而不是varchar或其他東西.... 因此,您必須更改數據庫中的值類型... 您無需編寫任何代碼或其他東西它直接排序當你點擊列頭...

+0

此外,您可以更改查詢以將結果轉換爲int,double或float。您不需要更改數據庫中的類型。 – 2017-12-06 16:15:37