2013-07-06 47 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)); 
}