所以我有一个带有自动生成列的DataGridView
,其中一些是复选框列。当我点击复选框列的标题时,它没有排序。我对它进行了研究,结果发现微软没有对复选框列进行自动排序......我认为这是荒谬的 - 排序检查/未检查有多难?
如何为您提供DataGridView
排序复选框列?
以下是我提出的建议:
答案 0 :(得分:2)
您也可以这样做:
DataGridView.Columns("ColumnOfChoice").SortMode = DataGridViewColumnSortMode.Automatic
适用于vb.net 4.0
答案 1 :(得分:2)
您只需要在表单代码中添加下一行(在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
答案 2 :(得分:1)
首先,你需要挂钩两个事件,列添加事件和列标题点击事件:
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
你去吧!微软现在真的那么难吗? ; - )
答案 3 :(得分:0)
我不确定VB,但对于设计师VS2012中的C#,你也可以设置SortMode。
右键单击DataGridView并转到“编辑列”。
SortMode有一个下拉列表,可选择NotSortable,Automatic和Programmatic。
大多数列的默认值似乎是自动,但对于复选框(布尔)列,默认值为NotSortable。
答案 4 :(得分:0)
我创建了一个可以重用的扩展方法,只需要在表单加载事件期间使用它。
------确保您的DataSource是可排序的。 ------
如果你将DataGridView绑定到一个简单的List它WONT WORK,你需要使用别的东西,我建议你使用this SortableBindingList;您可以直接将原始List IEnumerable传递给SortableBindingList的构造函数。
负载:
private void frmWithTheDataGrid_Load(object sender, EventArgs e)
{
this.yourDataGridView.SortabilizeMe();
}
然后将其添加到静态类to use it as an 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;
}
}
};
}
然后魔法会发生:)