在 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# winform datagridview cellendedit 在datagridview的第一列输入编码,第二,三列自动取值,名称和规格