这个问题与这两个问题(this和this)密切相关,但我不认为它们给予了令人满意的答案。
我有一个DataGridView
(即一个表),其中包含几个不同数据类型的列(DataGridViewTextBoxColumn
):字符串、整数和浮点数。当我点击它们各自的标题时,每一个都应该根据它们的类型排序:字符串按字母顺序排列,数字值按数字顺序排列。简单地说,我有以下代码:
private System.Windows.Forms.DataGridView grid;
private System.Windows.Forms.DataGridViewTextBoxColumn stringColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn doubleColumn;
private System.Windows.Forms.DataGridViewTextBoxColumn intColumn;
stringColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
doubleColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
intColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
grid.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
stringColumn,
doubleColumn,
intColumn});
但是,由于默认表示为string
,因此数值也按字母顺序排序,例如:
1, 11, 2, 3, 42, 5
显然,作为一种简单的解决方法,根据一些线程(例如here和here),以下代码应该可以立即解决问题:
doubleColumn.ValueType = typeof(double);
intColumn.ValueType = typeof(int);
但是,这个解决方案在我的项目中根本不起作用:值仍然是按字母顺序排序的。所以问题是:为什么不呢?在调试器中,我可以看到值类型实际上更改为(在double
的情况下)System.Double
,因此至少发生了一些事情。但是,如果不编写自己的排序器,我如何确保它实际上对它进行了相应的排序呢?
5条答案
按热度按时间6mw9ycah1#
您可以处理事件
SortCompare
来更改排序的方式,如下所示:注意:上面的代码假定您的单元格值可转换为int。
你说你的
DataGridView
没有赋值DataSource
,这意味着你手动地对行进行Add
,所以我认为你应该对单元格使用numeric
值而不是string
。这样排序就可以按你想要的那样进行了。vwoqyblh2#
如果你使用的是
DataTable
,那么你必须在DataColumn
上设置DataType
。在DataGridViewTextBoxColumn
上设置ValueType
没有帮助。您可以在建立时设定:
hl0ma9xz3#
将列从
string
更改为int32
可能会有所帮助:对我来说,它起作用了,我希望它能有帮助。
hjqgdpho4#
将列的ValueType设置为typeof(int)是可行的,但要记住确保在该列中输入了整数。如果数据的其余部分包含字符串,则很容易忘记将数字从字符串转换为int。
icomxhvb5#
https://www.youtube.com/watch?v=kKeTRPSLxX8观看此视频,它帮助很大
从该视频复制代码: