11

这个问题与这两个( thisthis )密切相关,但我认为他们没有给出令人满意的答案。

我有一个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

显然,作为解决这个问题的一种简单方法,根据一些线程(例如这里这里),以下应该可以立即解决问题:

doubleColumn.ValueType = typeof(double);
intColumn.ValueType = typeof(int);

但是,这个解决方案在我的项目中根本不起作用:值仍然按字母顺序排序。所以问题是:为什么不呢?在调试器中,我可以看到值类型实际上更改为 (in the doublecase) System.Double,所以至少发生了一些事情。但是,如果不编写我自己的分拣机,我如何才能确保它确实对它进行了相应的排序呢?

4

4 回答 4

22

您可以处理事件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你的单元格。这将使排序工作如你所愿。

于 2013-09-20T18:47:19.387 回答
4

如果您使用的是 aDataTable那么您必须DataTypeDataColumn. 设置不会ValueType有帮助。DataGridViewTextBoxColumn

您可以在创建时设置它:

table.Columns.Add("Number", typeof(int));
于 2017-10-30T19:41:15.557 回答
0

将列 ValueType 设置为 typeof(int) 将起作用,只需记住确保将整数放入该列。如果您的其余数据包含字符串,则很容易忘记将您的数字从字符串转换为 int。

于 2019-07-05T15:26:59.120 回答
0

将列从stringto更改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);

对我来说,它有效。我希望它会有所帮助。

于 2016-07-22T11:11:36.097 回答