winforms 在DataGridViewTextBoxColumn中按数字排序

kuuvgm7e  于 2022-11-25  发布在  其他
关注(0)|答案(5)|浏览(164)

这个问题与这两个问题(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

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

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

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

6mw9ycah

6mw9ycah1#

您可以处理事件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。这样排序就可以按你想要的那样进行了。

vwoqyblh

vwoqyblh2#

如果你使用的是DataTable,那么你必须在DataColumn上设置DataType。在DataGridViewTextBoxColumn上设置ValueType没有帮助。
您可以在建立时设定:

table.Columns.Add("Number", typeof(int));
hl0ma9xz

hl0ma9xz3#

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

对我来说,它起作用了,我希望它能有帮助。

hjqgdpho

hjqgdpho4#

将列的ValueType设置为typeof(int)是可行的,但要记住确保在该列中输入了整数。如果数据的其余部分包含字符串,则很容易忘记将数字从字符串转换为int。

icomxhvb

icomxhvb5#

https://www.youtube.com/watch?v=kKeTRPSLxX8观看此视频,它帮助很大
从该视频复制代码:

Private Sub dgvDailySales_SortCompare(sender As Object, e As DataGridViewSortCompareEventArgs) Handles dgvDailySales.SortCompare

Try
            Dim dval1, dval2 As Double

            If Not Double.TryParse(e.CellValue1.ToString, dval1) Then Return
            If Not Double.TryParse(e.CellValue2.ToString, dval2) Then Return

            If dval1 = dval2 Then
                e.SortResult = 0
            ElseIf dval2 > dval1 Then
                e.SortResult = -1
            ElseIf dval1 > dval2 Then
                e.SortResult = 1
            End If
            e.Handled = True
        Catch ex As Exception
            MsgBox(ex.Message, vbCritical)
        End Try
    End Sub

相关问题