在DataGridViewTextBoxColumn中以数字方式排序

Yel*_*low 7 c# sorting datagridview winforms

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

我有一个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});
Run Code Online (Sandbox Code Playgroud)

但是,由于默认表示是string,数值也会按字母顺序排序,例如:

1, 11, 2, 3, 42, 5
Run Code Online (Sandbox Code Playgroud)

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

doubleColumn.ValueType = typeof(double);
intColumn.ValueType = typeof(int);
Run Code Online (Sandbox Code Playgroud)

但是,此解决方案在我的项目中不起作用:值仍按字母顺序排序.所以问题是:为什么不呢?在调试器中,我可以看到值类型实际上已更改为(在这种double情况下)System.Double,所以至少发生了一些事情.但是,如何在不编写自己的分拣机的情况下确保相应地对其进行排序?

Kin*_*ing 13

您可以处理事件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
     }
}
Run Code Online (Sandbox Code Playgroud)

注意:上面的代码假设您的单元格值可以转换为int.

你说你DataGridView没有DataSource分配,这意味着你Add手动行,所以我认为你应该使用numeric值而不是string你的单元格.这将使排序按您的意愿工作.

  • @Yellow当你向`DataGridView`添加行时,只需尝试添加`numeric`值而不是`string`.然后您的网格将知道如何根据需要对列进行排序. (2认同)

Ale*_*Dev 5

如果您使用的是,DataTable则必须DataType在 上设置DataColumn。设置ValueTypeDataGridViewTextBoxColumn没有帮助。

创建时可以设置:

table.Columns.Add("Number", typeof(int));
Run Code Online (Sandbox Code Playgroud)