2010-12-02 52 views
28

我需要在DataGridView中禁用列标题排序。禁用DataGridView中列标题排序的最佳方法

我们可以做到这一点通过设置各列的性质类似

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

如果是这样的话,那么我会在所有的列具有循环。

有没有更好的方法?

回答

14

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

+1

存在与循环设置单独的列sortmode,例如,你允许用户添加更多的列了一点问题,那么你得重新循环所有这一切,或找到添加的列并将其设置为sortmode。这是一个更多的工作(对于重新循环的情况,在一个不可能的极端情况下,将单个列添加到已存在的数千个列中,这将是耗时的) – am05mhz 2016-01-14 03:32:56

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

这并没有实现任何目的。这使得datagridview中的所有列都不可排序。扩展方法本身并不是一个坏主意,但它并不完整。它需要有另一个参数,甚至可能超载,以允许列ID,列名称或任意一个集合被传入。 – 2010-12-02 12:44:30

+2

@Joel Etherton:再次阅读他的问题。 OP希望通常禁用列标题排序。 – VVS 2010-12-02 13:33:04

+0

得到它的有轻微的变形例的工作: 公共静态无效SetColumnSortMode(此的DataGridView的dataGridView,DataGridViewColumnSortMode sortMode) { 的foreach(在dataGridView.Columns DataGridViewTextBoxColumn列){dataGridView.Columns [column.Name] .SortMode = DataGridViewColumnSortMode。 NotSortable; } } – fa1c0n3r 2012-09-24 02:37:39

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

7

我不知道为什么没有人建议你这样做的LINQ的方式:

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

这对性能没有帮助。只是简化代码。 – 2016-04-22 13:52:25

2

如果你建立在运行时DataGridView的,你可以禁用列进行排序的列使用ColumnAdded事件说:

private void BalancesGridView_ColumnAdded(object sender, System.Windows.Forms.DataGridViewColumnEventArgs e) 
{ 
    e.Column.SortMode = DataGridViewColumnSortMode.NotSortable; 
} 
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 
1

我已经这样做了:

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

我发现,防止排序的最好方法是定义是定义它为一个循环,当你认为你有很多列来处理。

for (int i = 0; i < 10; i++) 
{ 
    dataGridView.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; 
} 
4

很好,这是有点老了,但与循环设置单独的列sortmode,例如,你允许用户添加更多的列了一点问题,那么你就必须重新循环这一切再次,或者找到添加的列并将其设置为sortmode。这是一个更多的工作。

我找到了解决办法是这样的链接:Disable sorting when clicking DataGridView column header

它,你只需要添加ColumnAdded的事件处理程序为DataGridView的,所以数据网格添加列时,它都会被自动设置为不可排序

这实际上就像@老狗的回答,不同之处在于在他的回答中,排序模式是以迂回的方式设置的。

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

我说通过列循环不是一个很好的答案,尤其是如果您的数据源不断变化。在ColumnAdded事件一行代码的伎俩:

e.Column.SortMode = DataGridViewColumnSortMode.NotSortable