这个问题与这两个问题密切相关(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
,因此至少发生了一些事情。但是,如何在不编写自己的分拣机的情况下确保实际对其进行排序?
答案 0 :(得分:11)
您可以处理事件SortCompare
以更改排序方式,如下所示:
private void dataGridView1_SortCompare(object sender, DataGridViewSortCompareEventArgs e) {
//Suppose your interested column has index 1
if (e.Column.Index == 1){
e.SortResult = int.Parse(e.CellValue1.ToString()).CompareTo(int.Parse(e.CellValue2.ToString()));
e.Handled = true;//pass by the default sorting
}
}
注意:上面的代码假设您的单元格值可以转换为int 。
您说您的DataGridView
没有分配DataSource
,这意味着您手动Add
行,因此我认为您应该使用numeric
值代替string
1}}为你的细胞。这样就可以根据需要进行排序。
答案 1 :(得分:1)
如果您使用DataTable
,则必须在DataType
上设置DataColumn
。在ValueType
上设置DataGridViewTextBoxColumn
无济于事。
您可以在创建时进行设置:
table.Columns.Add("Number", typeof(int));
答案 2 :(得分:0)
将列从string
更改为int32
可能会有所帮助:
for (int i = 0; i < tableDataGridView.Rows.Count; i++) {
DateTime dt = Convert.ToDateTime(tableDataGridView.Rows[i].Cells[9].Value.ToString());
DateTime dtnow = DateTime.Now;
TimeSpan ts = dtnow.Subtract(dt);
tableDataGridView.Rows[i].Cells[1].Value = Convert.ToInt32( ts.Days.ToString());
}
tableDataGridView.Sort(tableDataGridView.Columns[1], ListSortDirection.Descending);
对我来说,它有效。我希望它会有所帮助。
答案 3 :(得分:0)
将您的列ValueType设置为typeof(int)将起作用,只要记住确保将整数放入该列即可。如果您的其余数据包含字符串,则很容易忘记将数字从字符串转换为整数。