2013-07-06 48 views
1

好的,我有一個DataGridView其爲數據綁定等:DataGridView的小數不排序

dataGridViewChartOre.AutoGenerateColumns = false; 
dataGridViewChartOre.DataSource = xml.GetOreChart(); 
dataGridViewChartOre.DataMember = "ore"; 

所有列已經由UI手動創建。這些列由1個字符串組成,小數點後10位。最後一列是貨幣。

現在得到一個顯示在dataGridView中的貨幣很快就解決了一次,我記得xml的輸入總是一個字符串。使用這種方法:(發現其他地方在這個網站上。)

private void dataGridViewChartOre_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    { 
     string value = e.Value.ToString(); 
     decimal d; 

     if (decimal.TryParse(value, out d)) 
     { 
      e.Value = d; 
     } 
    } 

現在越來越,小數排序似乎是一個更大的問題。我已經嘗試了幾個建議的解決方案,但是目前爲止還沒有工作。

  • 使用float而不是小數。
  • 利用SortCompare // SortResult

現在,它的所有排序小數僅它的第一個號碼,即:

8616 
8225 
785995 
7833 
78069 
773403 
750268 
74521 
738249 
714541 
70972 
and so on 

那麼如何解決這個問題,如果有人能更好向我解釋爲什麼這樣做?

另外,在附註中,如何更改CurrencySymbol?我想在整個程序中使用不同的符號,但是它應該保留常規的en-US日期時間格式。

+0

你確定你手動添加的DataGridViewColumns是十進制類型嗎?您的相應DataSource列應先轉換爲小數點。 –

回答

0

您的DataGridView列類型取決於基礎數據的實際類型。您無法更改基礎數據的類型,您在CellFormatting事件處理程序中更改的內容僅爲單元格值。如果單元格值類型發生更改,使其類型與所屬列的類型(由底層數據確定)不匹配,則會拋出FormatException。我猜你的代碼(在CellFormatting事件處理程序中)會拋出該異常,如果在更改單元格值後添加e.FormattingApplied = true;,這實際上會影響格式化,但是您錯過了它)。

您提到SortCompare事件,並表示它沒有幫助,但我認爲你可能不會以正確的方式使用它。我試過這個解決方案,它的工作原理如下:

private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) 
{ 
    e.SortResult = Compare(e.CellValue1.ToString(), e.CellValue2.ToString()); 
} 
private int Compare(string a, string b) 
{ 
    return decimal.Parse(a).CompareTo(decimal.Parse(b)); 
}