我试图在我的(未绑定的)DataGridView控件上的任何列上实现一个通用的SortCompare事件处理程序。所有单元格数据都写为字符串,但实际上它们中的一些用作整数(即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是自动的。只是结果似乎已被字符串排序。
也许在我的DataGridView中没有配置某些东西?
答案 0 :(得分:0)
我猜这种排序是在你的int比较之后恢复到字符串比较。如果您指示事件已使用e.Handled = true;
行处理,则您的代码将按预期工作。您是否尝试将代码行e.Handled = true;
添加到代码的末尾?
下面的代码检查要排序的列是否为数字列。如果是,则按数字排序,否则按字符串值排序。希望这会有所帮助。
private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) {
if (e.Column.Name == "NumberColumn") {
if (int.TryParse(e.CellValue1.ToString(), out int value1) && int.TryParse(e.CellValue2.ToString(), out int value2)) {
e.SortResult = value1.CompareTo(value2);
e.Handled = true;
}
}
}
另外,作为附注,您似乎已将DataGridView
“DataGridView”命名为......这不是一个好主意。