【问题标题】:DataGridView decimal not sortingDataGridView十进制不排序
【发布时间】:2013-07-04 11:12:48
【问题描述】:

好的,我有一个 DataGridView,它正在被数据绑定,例如:

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

所有列都是通过用户界面手动创建的。列由 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;
        }
    }

现在,要排序的小数似乎是一个更大的问题。我已经尝试了几个建议的解决方案,但到目前为止都没有奏效。

  • 使用浮点数代替小数。
  • 利用 SortCompare // SortResult

现在,它仅按第一个数字对所有小数进行排序,即:

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

那么如何解决这个问题,如果有人可以向我解释为什么会这样,那就更好了?

另外,顺便说一句,如何更改 CurrencySymbol?我想在整个程序中使用不同的符号,但是,它应该保留常规的 en-US 日期时间格式。

【问题讨论】:

  • 您确定手动添加的DataGridViewColumns 是十进制类型吗?您对应的 DataSource 列应先转换为十进制。

标签: c# winforms sorting datagridview currency-formatting


【解决方案1】:

您的DataGridView 列类型取决于基础数据的实际类型。您无法更改基础数据的类型,您在CellFormatting 事件处理程序中更改的只是单元格值。如果单元格值类型发生更改,使其类型与所属列的类型不匹配(由基础数据确定),则会抛出FormatException。如果您在更改单元格值后添加e.FormattingApplied = true;,我猜您的代码(在CellFormatting 事件处理程序中)会抛出该异常,这实际上会影响格式,但您错过了)。

您提到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));
}

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多