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

29

我需要禁用 DataGridView 中列头的排序。

我们可以通过设置各个列的属性来实现:

BalancesGridView.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable;

如果是这种情况,那么我就必须遍历所有列。

有更好的方法吗?

10个回答

14

不,我认为直接在列上设置SortMode已经足够好了。但是说实话,谁在乎呢?使用简单的循环有什么不好的?


1
循环设置各列的排序模式存在一些小问题,例如,您允许用户添加更多列,那么您必须重新循环所有列,或者找到添加的列并设置其排序模式。这需要更多的工作(对于重新循环的情况,在已经存在成千上万个列的情况下添加单个列的极端情况下,这将耗费大量时间)。 - am05mhz

13

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

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);

这并不能真正实现任何功能。这将使 datagridview 中的所有列都无法排序。扩展方法本身并不是一个坏主意,但它是不完整的。它需要另一个参数,甚至可能需要一个重载函数来允许传递列 ID、列名称或两者的集合。 - Joel Etherton
2
@Joel Etherton:请再次阅读他的问题。OP希望总体上禁用列标题排序。 - VVS
稍作修改就可以让它正常工作:public static void SetColumnSortMode(this DataGridView dataGridView, DataGridViewColumnSortMode sortMode) { foreach (DataGridViewTextBoxColumn column in dataGridView.Columns) { dataGridView.Columns[column.Name].SortMode = DataGridViewColumnSortMode.NotSortable; } } - fa1c0n3r

8
我不知道为什么没有人建议你使用Linq来完成这个操作:
BalancesGridView.Columns.Cast<DataGridViewColumn>().ToList().ForEach(f => f.SortMode = DataGridViewColumnSortMode.NotSortable);

2
这并没有真正提高性能,只是让代码更短而已。 - Samy S.Rathore

5

我认为循环遍历列并不是一个好的答案,尤其是当您的数据源时常变化。在ColumnAdded事件中加入一行代码即可解决问题:

e.Column.SortMode = DataGridViewColumnSortMode.NotSortable

4

嗯,这有点老了,但是循环设置单个列的排序模式存在一些问题,例如,您允许用户添加更多列,那么您必须重新循环所有内容,或者找到添加的列并设置其排序模式。 这需要更多的工作。

我发现的解决方案如下链接:禁用DataGridView列标题的排序

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

实际上,这就像@OldDog的答案,不同之处在于他的答案采用了迂回的方式设置排序模式。

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

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的困境,除非使用绑定数据。然后,您可以为每个单独的列设置不可排序。


2
如果您在运行时构建DataGridView,则可以使用ColumnAdded事件在添加列时禁用列排序:
private void BalancesGridView_ColumnAdded(object sender, System.Windows.Forms.DataGridViewColumnEventArgs e)
{
     e.Column.SortMode = DataGridViewColumnSortMode.NotSortable;
}

1
我是这样做的:

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

您能否详细阐述一下您的答案,并对您提供的解决方案进行更多描述? - abarisone
它会起作用,但这是一种不好的做法。对于每个添加的行,您将再次设置相同列的排序模式,一遍又一遍... - ehh

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

0
我发现防止排序的最好方法是在你认为要处理的列太多时,定义一个for循环来处理它。
for (int i = 0; i < 10; i++)
{
   dataGridView.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
}

如果列长度小于10怎么办?这将抛出一个异常。 - InspiredCoder
循环的一个不良示例,问题作者明确要求循环的替代方案。还会使问题与答案变得混乱无序。 - workabyte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接