我有一个从 sql 表绑定的 datagridview,在该 dv 中我有这些属性:Id、Name 和 Price。当我将名称列的 SortMode 设置为自动并单击此列的标题时,我可以根据名称的第一个字母对该 dv 进行排序,这样我可以根据产品的第一个字母(Acumulator、Boat、可口可乐、发动机等)。
有没有办法在不单击列名称的标题的情况下发生这种情况。我正在寻找一些可以在表单加载时完成这项工作的代码。
我有一个从 sql 表绑定的 datagridview,在该 dv 中我有这些属性:Id、Name 和 Price。当我将名称列的 SortMode 设置为自动并单击此列的标题时,我可以根据名称的第一个字母对该 dv 进行排序,这样我可以根据产品的第一个字母(Acumulator、Boat、可口可乐、发动机等)。
有没有办法在不单击列名称的标题的情况下发生这种情况。我正在寻找一些可以在表单加载时完成这项工作的代码。
DataGridView 上有一个名为“Sort”的方法:
this.dataGridView1.Sort(this.dataGridView1.Columns["Name"], ListSortDirection.Ascending);
这将以编程方式对您的 datagridview 进行排序。
dataGridView1.Sort(dataGridView1.Columns[0],ListSortDirection.Ascending);
您可以通过对返回的数据进行排序来控制从 SQL 数据库返回的数据:
orderby [Name]
如果您从应用程序执行 SQL 查询,请对返回的数据进行排序。例如,创建一个调用过程或执行 SQL 的函数,并给它一个获取 orderby 条件的参数。因为如果您订购从数据库返回的数据,它会消耗时间,但是会订购它,因为它是按照您所说的那样执行的,您希望它不是从 UI 订购的,您希望它在运行时订购,所以在执行 SQL 时订购它询问。
这个更简单:)
dataview dataview1;
this.dataview1= dataset.tables[0].defaultview;
this.dataview1.sort = "[ColumnName] ASC, [ColumnName] DESC";
this.datagridview.datasource = dataview1;
最好的方法是在绑定数据源之前对列表进行排序。
cars = cars.OrderBy(o => o.year).ThenBy(o => o.color).ToList();
adgCars.DataSource = cars;
对不起,我的英语不好。
使用Datatable.Default.Sort
属性,然后将其绑定到 datagridview。
我知道这个问题的 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