所以我有一个DataGridView
自动生成的列,其中一些是复选框列。当我单击复选框列的标题时,它没有排序。我对其进行了研究,结果发现微软没有对复选框列进行自动排序......我认为这很荒谬——对选中/未选中进行排序有多难?
你怎么能得到一个DataGridView
为你排序的复选框列?
这是我想出的:
所以我有一个DataGridView
自动生成的列,其中一些是复选框列。当我单击复选框列的标题时,它没有排序。我对其进行了研究,结果发现微软没有对复选框列进行自动排序......我认为这很荒谬——对选中/未选中进行排序有多难?
你怎么能得到一个DataGridView
为你排序的复选框列?
这是我想出的:
你也可以简单地这样做:
DataGridView.Columns("ColumnOfChoice").SortMode = DataGridViewColumnSortMode.Automatic
适用于 vb.net 4.0
您只需要在表单的代码中添加下一行(在 VB.NET 2013 中测试)
Private Sub DataGridView1_ColumnAdded(sender As Object, e As System.Windows.Forms.DataGridViewColumnEventArgs) Handles DataGridView1.ColumnAdded
If e.Column.GetType Is GetType(DataGridViewCheckBoxColumn) Then
e.Column.SortMode = DataGridViewColumnSortMode.Automatic
End If
End Sub
首先需要挂钩两个事件,列添加事件和列标题点击事件:
AddHandler dg.ColumnAdded, AddressOf dgColumnAdded
AddHandler dg.ColumnHeaderMouseClick, AddressOf dgSortColumns
然后,为每个复选框列启用编程排序:
Private Sub dgColumnAdded(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewColumnEventArgs)
If e.Column.GetType Is GetType(DataGridViewCheckBoxColumn) Then
e.Column.SortMode = DataGridViewColumnSortMode.Programmatic
End If
End Sub
然后,创建一个对复选框列进行排序的处理程序,但对将处理自己的排序的列不执行任何操作:
Private Sub dgSortColumns(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs)
Dim dg As DataGridView = sender
Dim c As DataGridViewColumn = dg.Columns(e.ColumnIndex)
If c.SortMode = DataGridViewColumnSortMode.Programmatic Then
If dg.SortedColumn IsNot Nothing _
AndAlso dg.SortedColumn.Name <> c.Name Then
dg.Sort(c, System.ComponentModel.ListSortDirection.Ascending)
Else
Select Case dg.SortOrder
Case Windows.Forms.SortOrder.None
dg.Sort(c, System.ComponentModel.ListSortDirection.Ascending)
Case Windows.Forms.SortOrder.Ascending
dg.Sort(c, System.ComponentModel.ListSortDirection.Descending)
Case Windows.Forms.SortOrder.Descending
dg.Sort(c, System.ComponentModel.ListSortDirection.Ascending)
End Select
End If
End If
End Sub
你去吧!微软真的那么难吗?;-)
我创建了一个可以重复使用的扩展方法,你只需要在表单加载事件期间使用它。
------ 确保您的 DataSource 是可排序的。------
如果您将 DataGridView 绑定到一个简单的列表,它不会工作,您需要使用其他东西,我建议您使用这个 SortableBindingList;您可以将原始 List IEnumerable 直接传递给 SortableBindingList 的构造函数。
加载:
private void frmWithTheDataGrid_Load(object sender, EventArgs e)
{
this.yourDataGridView.SortabilizeMe();
}
然后将其添加到静态类中以将其用作 ExtensionMethod ..
public static void SortabilizeMe(this DataGridView dgv)
{
dgv.ColumnAdded+= delegate(object sender, DataGridViewColumnEventArgs args)
{
args.Column.SortMode = DataGridViewColumnSortMode.Programmatic;
};
dgv.ColumnHeaderMouseClick += delegate(object sender, DataGridViewCellMouseEventArgs args)
{
var col = dgv.Columns[args.ColumnIndex];
if (dgv.SortedColumn != null && dgv.SortedColumn.Name != col.Name)
{
dgv.Sort(row, ListSortDirection.Ascending);
}
else
{
switch (dgv.SortOrder)
{
case SortOrder.None:
dgv.Sort(col, ListSortDirection.Ascending);
break;
case SortOrder.Ascending:
dgv.Sort(col, ListSortDirection.Descending);
break;
case SortOrder.Descending:
dgv.Sort(col, ListSortDirection.Ascending);
break;
}
}
};
}
然后魔术就会发生:)
I'm not sure about VB, but for C# in VS2012 in the designer you can also set the SortMode.
Right-click on the DataGridView and go to "Edit Columns".
There's a drop-down for SortMode with a choice of NotSortable, Automatic, and Programmatic.
It appears that the default for most columns is Automatic, but for checkboxes (boolean) columns the default is NotSortable.