如何在CheckBox列上对WinForms DataGridView进行排序?

时间:2013-02-06 17:33:44

标签: vb.net datagridview datagridviewcheckboxcell

所以我有一个带有自动生成列的DataGridView,其中一些是复选框列。当我点击复选框列的标题时,它没有排序。我对它进行了研究,结果发现微软没有对复选框列进行自动排序......我认为这是荒谬的 - 排序检查/未检查有多难?

如何为您提供DataGridView排序复选框列?

以下是我提出的建议:

5 个答案:

答案 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;
            }
        }
    };
}

然后魔法会发生:)