在 C# 中对 dataGridView 列进行排序? (Windows 窗体)

Posted

技术标签:

【中文标题】在 C# 中对 dataGridView 列进行排序? (Windows 窗体)【英文标题】:Sort dataGridView columns in C# ? (Windows Form) 【发布时间】:2010-10-22 20:18:25 【问题描述】:

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

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

【问题讨论】:

答案是:this.dataGridView1.Sort(this.dataGridView1.Columns["Name"],ListSortDirection.Ascending); olumnheader 点击 c# datagridview 【参考方案1】:

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

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

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

【讨论】:

排序消耗的时间怎么样,他想在负载中排序,那么在执行SQL语句而不是绑定之后排序呢!我认为它会消耗更多时间 是的,Ahmy 是对的,就性能而言,最好在数据库端对其进行排序。因此,如果您使用 SQL 直接与数据库交互,请在查询末尾附加一个 order by。我只是在回答问题。这是在代码中对 DGV 进行排序的方法。 好的,如果 AXheladini 需要它,那没关系,但我从他的问题中了解到他在 UI 中不需要它,所以我想节省时间,我很高兴 AXheladini 找到了解决方案并且这就是我们希望从我们的答案中得到的结果 Ahme 你的解决方案没问题,但正如我告诉你的那样,我正在从 UI 填充这个网格,我没有用 c# 编码。顺便说一句,如果我们用代码完成所有这些工作,您的解决方案就可以工作。我试过了,但我需要的是 BFree 的答案。感谢所有试图回答这个问题的人。【参考方案2】:
dataGridView1.Sort(dataGridView1.Columns[0],ListSortDirection.Ascending);

【讨论】:

我同意使用数字索引比使用字符串索引更好,因为如果您将来更改列名,您也必须更改字符串索引。【参考方案3】:

这个比较简单:)

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 我不使用查询。有没有办法访问数据源的查询并纠正这个问题? 我的意思是查询数据库并返回数据的SQL语句在你使用的过程中或在DAL层的SQL语句中添加语法orderby【参考方案5】:

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

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

对不起,我的英语不好。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

我知道这个问题的 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

【讨论】:

以上是关于在 C# 中对 dataGridView 列进行排序? (Windows 窗体)的主要内容,如果未能解决你的问题,请参考以下文章

C#中DataGridView的错误列中的数据检索

C#如何获取datagridview中某一整列的数据。

c# datagridview 排序

C# DataGridView的列标题能否居中?

C# datagridview绑定集合,怎样点击列标题使之排序

c# winform datagridview cellendedit 在datagridview的第一列输入编码,第二,三列自动取值,名称和规格