簡體   English   中英

如何在CheckBox列上對WinForms DataGridView進行排序?

[英]How can I sort a WinForms DataGridView on a CheckBox column?

所以我有一個帶有自動生成列的DataGridView ,其中一些是復選框列。 當我單擊復選框列的標題時,它沒有排序。 我對其進行了研究,結果發現Microsoft不包括復選框列的自動排序...我認為這很荒謬-選中/不選中的排序有多難?

您如何獲得一個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

然后你走了! 微軟,現在真的那么難嗎? ;-)

我不確定VB,但在VS2012中的C#設計器中,您還可以設置SortMode。

右鍵單擊DataGridView並轉到“編輯列”。

有一個SortMode下拉菜單,可以選擇NotSortable,Automatic和Programmatic。

似乎大多數列的默認值為“自動”,但復選框(布爾)列的默認值為“ NotSortable”。

我創建了一個擴展方法,可以重用,您只需要在表單加載事件中使用它即可。

------確保您的數據源是可排序的。 ------

如果要將DataGridView綁定到一個簡單的List it WONT WORK,則需要使用其他東西,我建議您使用此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;
            }
        }
    };
}

然后魔術就會發生:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM