我只使用一个简单的DataGridView来保存一堆数据(搞笑)。
我在特定列中有小数。但是当按照那个十进制列排序时,它会错误地命令它。例如:
起始顺序可能是:
结束顺序为:
如您所见,它从第一个数字开始命令它。然后以这种方式命令它。
我想可能我可以将列设置为不同的“ColumnType”,并且可以自动执行此操作。但是没有“数字”或“十进制”列类型。
我在MSDN上查找问题,我可以找到可以在DataGridView上使用的“排序”方法。但是解释有点过头了,示例没有使用数字,只有文字,所以我无法看到我应该如何切换。
非常感谢任何帮助。
答案 0 :(得分:8)
您可以通过使用以下代码在DataGridView上为SortCompare事件添加处理程序来解决此问题:
private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
if (e.Column.Index == 0)
{
if (double.Parse(e.CellValue1.ToString()) > double.Parse(e.CellValue2.ToString()))
{
e.SortResult = 1;
}
else if (double.Parse(e.CellValue1.ToString()) < double.Parse(e.CellValue2.ToString()))
{
e.SortResult = -1;
}
else
{
e.SortResult = 0;
}
e.Handled = true;
}
}
在MSDN中有SortResult值的描述:
如果第一个单元格将小于零 在第二个小区之前排序;零 如果第一个细胞和第二个细胞有 等价值;大于零 如果第二个单元格将被排序 在第一个细胞之前。
请注意,在我的测试床中,唯一的数字列是第一列(索引为0),这就是我对列索引进行检查的原因。
此外,根据您的需求和数据,您可能需要优化我的代码 - 例如,如果由于某种原因您的列中包含非数字数据,我的代码将抛出异常。
您可能已经看过它,但是here是自定义DataGridView排序的MSDN页面的链接。如你所说,他们只处理文字。
答案 1 :(得分:6)
我遇到了同样的问题。我尝试使用David Hall提到的事件处理程序。我在定义DataGridView时使用了ValueType属性。它现在排序为双打,不需要自定义事件处理程序代码
dataGridView1.Columns[int index].ValueType = typeof(double);
您也可以使用
格式化列dataGridView2.Columns[int index].DefaultCellStyle.Format = string format;
答案 2 :(得分:1)
数字类型具有内置的CompareTo函数,可用作SortCompare事件的SortResult。
private void dataGridView_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
if (e.Column.Index == 0)
{
e.SortResult = int.Parse(e.CellValue1.ToString()).CompareTo(int.Parse(e.CellValue2.ToString()));
e.Handled = true;
}
}
这当然是假设您知道DataGridView中的类型。
答案 3 :(得分:1)
您的数据库列类型应为int或double或float,而不是varchar或者其他内容.... 所以你必须在数据库中更改你的值类型...... 当您单击Header ...
列时,您无需编写任何代码或其直接排序的内容答案 4 :(得分:0)
按字符排序。您需要使列类型为float,以便它知道要应用的比较运算符。
(那就是你需要让你的数据集中的列类型浮动,我相信它会起作用。)
答案 5 :(得分:0)
您的问题是datagridview
按字符串排序。将该单元格复制到string
时,请尝试将float
转换为datagrid
。