在DataGridView中禁用列标题排序的最佳方法

时间:2010-12-02 12:30:20

标签: c# .net winforms datagridview

我需要在DataGridView中禁用列标题排序。

我们可以通过设置

等各列的属性来实现
BalancesGridView.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable;

如果是这种情况,那么我将不得不遍历所有列。

有更好的方法吗?

10 个答案:

答案 0 :(得分:14)

不,我认为直接在列上设置SortMode就好了。但老实说,谁在乎呢?一个简单的循环有什么坏处?

答案 1 :(得分:13)

这有什么不好的?如果你不喜欢循环列或者有多个DataGridViews,你可以为此编写一个扩展方法:

public static class DatatGridViewExtensions
{
    public static void SetColumnSortMode(this DataGridView dataGridView, DataGridViewColumnSortMode sortMode)
    {
        foreach (var column in dataGridView.Columns)
        {
            column.SortMode = sortMode;
        }
    }
}

像这样使用:

BalancesGridView.SetColumnSortMode(DataGridViewColumnSortMode.NotSortable);

答案 2 :(得分:8)

我不知道为什么没有人建议您使用Linq这样做:

BalancesGridView.Columns.Cast<DataGridViewColumn>().ToList().ForEach(f => f.SortMode = DataGridViewColumnSortMode.NotSortable);

答案 3 :(得分:4)

嗯,这有点旧,但循环设置单个列排序模式有一点问题,例如,你允许用户添加更多列,然后你必须再次重新循环它,或者找到添加的列并设置它的sortmode。这是一项更多的工作。

我找到的解决方案就像这个链接:Disable sorting when clicking DataGridView column header

在其中,您只需为该DataGridView添加ColumnAdded的事件处理程序,因此每次datagrid添加列时,它都会自动设置为不可排序

这实际上就像@ OldDog的回答一样,不同之处在于,在他的回答中,sortmode是以迂回的方式设置的。

Private Sub DataGridView1_ColumnAdded(sender As Object, e As DataGridViewColumnEventArgs) Handles DataGridView1.ColumnAdded
    e.Column.SortMode = DataGridViewColumnSortMode.NotSortable
End Sub

答案 4 :(得分:4)

我说循环遍历列并不是一个很好的答案,特别是如果您的数据源不时发生变化。 ColumnAdded事件中的一行代码可以解决这个问题:

e.Column.SortMode = DataGridViewColumnSortMode.NotSortable

答案 5 :(得分:3)

我今天遇到了这个问题。我编写了这个方法并在表单加载事件上调用它。

    public void DisableGridviewSorting(DataGridView grid, int index)
    {
        //Index = DataGridView.Columns.Count
        for (int i = 0; i < index; i++)
        {
            grid.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
        }
    }

除非你使用绑定数据,否则无论你怎么做,看起来你几乎都在循环使用DataGridView。然后,您可以为每个列设置不可排序。

答案 6 :(得分:2)

如果在运行时构建DataGridView,则可以在使用ColumnAdded事件添加列时禁用列排序:

private void BalancesGridView_ColumnAdded(object sender, System.Windows.Forms.DataGridViewColumnEventArgs e)
{
     e.Column.SortMode = DataGridViewColumnSortMode.NotSortable;
}

答案 7 :(得分:1)

我是这样做的:

private void gvItReq_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    for (int colIdx = 0; colIdx < gvItReq.Columns.Count; colIdx++)
        gvItReq.Columns[colIdx].SortMode = DataGridViewColumnSortMode.NotSortable;
}

答案 8 :(得分:0)

在VB中,我使用了一个小子程序,我为每个dgv调用,我希望列不可分类:

Public Sub subNo_Sort_DGV_Columns(dgv As DataGridView)

  For intColumn_Count As Integer = 1 To dgv.Columns.Count - 1
    dgv.Columns(intColumn_Count).SortMode = _ DataGridViewColumnSortMode.NotSortable
  Next

End Sub

答案 9 :(得分:0)

我发现阻止排序的最好方法是定义是当你认为你需要处理很多列时将它定义为for循环。

SELECT cast(CREATED as date) AS DATE, COUNT([ID]) AS BOOKINGS, SUM([TOTCOST]) AS Sales
from BOOKING
WHERE
CREATED >= (DATEADD(month, datediff(month, 0, getdate())-12, 0) + 1)
AND
CREATED < (DATEADD(month, datediff(month, 0, getdate())-11, 0) + 1)
GROUP BY cast(CREATED as date)
ORDER BY cast(CREATED as date)