58

我有一个从 sql 表绑定的 datagridview,在该 dv 中我有这些属性:Id、Name 和 Price。当我将名称列的 SortMode 设置为自动并单击此列的标题时,我可以根据名称的第一个字母对该 dv 进行排序,这样我可以根据产品的第一个字母(Acumulator、Boat、可口可乐、发动机等)。

有没有办法在不单击列名称的标题的情况下发生这种情况。我正在寻找一些可以在表单加载时完成这项工作的代码。

4

7 回答 7

123

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

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

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

于 2009-04-30T13:05:29.687 回答
17
dataGridView1.Sort(dataGridView1.Columns[0],ListSortDirection.Ascending);
于 2010-08-22T06:43:08.817 回答
4

您可以通过对返回的数据进行排序来控制从 SQL 数据库返回的数据:

orderby [Name]

如果您从应用程序执行 SQL 查询,请对返回的数据进行排序。例如,创建一个调用过程或执行 SQL 的函数,并给它一个获取 orderby 条件的参数。因为如果您订购从数据库返回的数据,它会消耗时间,但是会订购它,因为它是按照您所说的那样执行的,您希望它不是从 UI 订购的,您希望它在运行时订购,所以在执行 SQL 时订购它询问。

于 2009-04-30T12:58:20.157 回答
4

这个更简单:)

dataview dataview1; 
this.dataview1= dataset.tables[0].defaultview;
this.dataview1.sort = "[ColumnName] ASC, [ColumnName] DESC";
this.datagridview.datasource = dataview1;
于 2015-05-22T08:50:39.363 回答
3

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

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

对不起,我的英语不好。

于 2019-05-24T21:56:09.403 回答
0

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

于 2009-04-30T12:57:38.833 回答
0

我知道这个问题的 2 个解决方案。

1.排序(DataGridViewColumn列,ListSortDirection方向)函数

此函数可用于按字母或数字或日期的降序或升序对列进行排序。

例子:

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

2.排序(IComparer比较器)功能

此功能可用于所有其他情况,如

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

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

使用 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
于 2022-01-02T23:33:11.630 回答