【发布时间】:2017-10-31 16:01:51
【问题描述】:
我试图实现一个通用的 SortCompare 事件处理程序,用于我的(未绑定的)DataGridView 控件上的任何列。所有单元格数据都写为字符串,但实际上其中一些用作整数(即 int.TryParse 将返回 true)。目的是如果发现数据是整数,则将它们作为整数进行比较,否则将使用字符串比较作为后备。
问题在于,在一个特定列上,其中所有单元格的数据都是空字符串或可转换为 int 的字符串,结果似乎已按字符串排序(例如“13”、“135”、“1350” , "14", "149", "15") 而不是整数(例如 13, 14, 15, 135, 149, 1350)。奇怪。
这是我的事件处理程序 (C#):
private void DataGridView_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
var cell1 = e.CellValue1.ToString();
var cell2 = e.CellValue2.ToString();
if (cell1 == cell2)
{
e.SortResult = 0;
return;
}
if (cell1 == "")
{
e.SortResult = -1;
return;
}
if (cell2 == "")
{
e.SortResult = 1;
return;
}
int value1, value2;
if (int.TryParse(cell1, out value1) && int.TryParse(cell2, out value2))
e.SortResult = value1 - value2; // Integer comparison
else
e.SortResult = string.Compare(cell1, cell2, StringComparison.InvariantCultureIgnoreCase); // String comparison
}
我可以验证注释为“整数比较”的行被多次命中,而注释为“字符串比较”的行从未被命中。事件处理程序触发似乎没有任何问题。不抛出异常。该列的 SortMode 是 Automatic。只是结果似乎是按字符串排序的。
也许我的 DataGridView 中没有正确配置某些内容?
【问题讨论】:
-
并不奇怪。字符串不是数字。当您尝试将数字作为字符串排序时,您会得到一个词法比较,其中
"9"的排序将高于"100",因为"9">"1"。这里有几种很好的自然排序方法,但是尝试将数字作为字符串进行比较并不是一个好主意
标签: c# .net winforms datagridview