在C#中对dataGridView的列进行排序?(Windows表单)

63
我有一个 datagridview,它是从 SQL 表绑定而来的。在这个 dv 中,我有这些属性:Id、Name 和 Price。当我将 Name 列的 SortMode 设置为 Automatic 并单击该列的标题时,我可以根据 Name 的首字母对此 dv 进行排序,这样我就可以根据产品名称的首字母(例如 Accumulator、Boat、CocaCola、Engine 等)排序产品。

是否有一种方法可以在不点击 Name 列标题的情况下实现这一点。我正在寻找一些代码,在加载表单时会自动执行此操作。


2
答案是:this.dataGridView1.Sort(this.dataGridView1.Columns["Name"],ListSortDirection.Ascending); - AXheladini
列标题单击事件 C# DataGridView - NXT
7个回答

132

DataGridView有一个名为“Sort”的方法:

this.dataGridView1.Sort(this.dataGridView1.Columns["Name"], ListSortDirection.Ascending);

这将以编程方式对您的DataGridView进行排序。


那么排序所消耗的时间怎么办呢?他希望在负载中进行排序,执行 SQL 语句时进行排序,而不是在绑定之后进行排序!我认为这样会消耗更多时间。 - Ahmy
是的,Ahmy是正确的,从性能角度来看,在数据库端对其进行排序可能更好。因此,如果您使用SQL直接与DB交互,则将order by附加到查询的末尾即可。我只是回答问题。这是在代码中对DGV进行排序的方法。 - BFree
1
如果AXheladini需要的话那就没问题,但是我从他的问题中理解到他不需要在UI中使用它,所以我想要节省时间。我很高兴AXheladini找到了解决方案,这也是我们回答问题的愿望。 - Ahmy
Ahme,你的解决方案还可以,但是我告诉过你,我是通过UI来填充这个网格的,而不是用C#编写代码。顺便说一句,如果我们用代码完成所有工作,你的解决方案是可行的。我尝试过了,它可以工作,但我需要的是BFree的答案。无论如何,感谢所有尝试回答这个问题的人。 - AXheladini

17
dataGridView1.Sort(dataGridView1.Columns[0],ListSortDirection.Ascending);

1
我认为使用数字索引比字符串索引更好,因为如果您将来更改列名,您还必须更改字符串索引。 - 123iamking
另一方面,如果您更改列顺序...现在更有可能是什么? - TaW

4
这个更简单 :)
dataview dataview1; 
this.dataview1= dataset.tables[0].defaultview;
this.dataview1.sort = "[ColumnName] ASC, [ColumnName] DESC";
this.datagridview.datasource = dataview1;

4
你可以通过对返回数据进行排序来控制从SQL数据库返回的数据:
orderby [Name]

如果您从应用程序执行SQL查询,请对返回的数据进行排序。例如,创建一个调用存储过程或执行SQL的函数,并给它一个参数来获取orderby标准。因为如果您从数据库中按顺序返回数据,这将消耗时间,但是在执行时对其进行排序,因为您希望它按照您要求的顺序排序,而不是从UI中排序,所以在执行SQL查询时对其进行排序。

我正在自动绑定DataGridView,不使用查询。是否有一种方法可以访问数据源的查询并进行更正? - AXheladini
我的意思是,在查询数据库并返回数据的SQL语句中,您可以在使用的过程或DAL层中的SQL语句中添加orderby语法。 - Ahmy

3

最好的方法是在绑定数据源之前对列表进行排序。

cars = cars.OrderBy(o => o.year).ThenBy(o => o.color).ToList(); adgCars.DataSource = cars;

抱歉我的英语不好。


0

我知道两种解决这个问题的方法。

1. Sort (DataGridViewColumn column, ListSortDirection direction) 函数

该函数可用于按字母顺序、数字顺序或日期顺序升序或降序排序列。

例如:

dataGridView.Sort(dataGridView1.Columns[5],ListSortDirection.Ascending);

2. Sort (IComparer comparer) 函数

此函数可用于所有其他情况,例如:

按不同于数字顺序的特定顺序对列进行排序(例如:仅使用绝对值对可能为负数或正数的金额进行排序)

按不同于字母顺序的特定顺序对列进行排序(例如:使用不区分大小写的排序对文本进行排序)

对多个列进行排序,例如将 AMOUNT 列作为第一列,DATE 列作为第二列进行表格排序。

VB.Net 示例:

Private Sub pbSort_Click(sender As Object, e As EventArgs) _ 
    Handles pbSort.Click

    grid.Sort(New AmountDateComparer(Me))
End Sub

Private Class AmountDateComparer : Implements IComparer

    Private frm As FrmSearch

    Public Sub New(frm As FrmSearch)
        Me.frm = frm
    End Sub

    Public Function Compare(x1 As Object, x2 As Object) As Integer _
        Implements IComparer.Compare

        Dim row1 As DataGridViewRow = x1
        Dim row2 As DataGridViewRow = x2

        ' compare AMOUNT values of columns

        Dim nAmount1 = Convert.ToDecimal(row1.Cells(frm.Col_AMOUNT.Index).Value)
        Dim nAmount2 = Convert.ToDecimal(row2.Cells(frm.Col_AMOUNT.Index).Value)

        Dim iCompareResult As Integer 
            = System.Decimal.Compare(nAmount1, nAmount2)

        If iCompareResult = 0 Then
            'compare DATE values of columns
            Dim d1 = Convert.ToDateTime(row1.Cells(frm.Col_DATE.Index).Value)
            Dim d2 = Convert.ToDateTime(row2.Cells(frm.Col_DATE.Index).Value)

            iCompareResult = System.DateTime.Compare(d1, d2)
        End If

        Return iCompareResult
    End Function
End Class

0
使用 Datatable.Default.Sort 属性,然后将其绑定到 datagridview。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接