【问题标题】:.NET / WinForms - Clear a Sort on a DataGridView.NET / WinForms - 清除 DataGridView 上的排序
【发布时间】:2009-09-09 20:21:17
【问题描述】:

告诉 DataGridView 停止排序的正确方法是什么?

我有一个“屏幕”,我在其中以编程方式告诉网格按第 4 列和升序排序。 当我切换到另一个区域时,我希望相同的网格进入“默认”/无排序。 我正在删除所有列并添加新列。排序保留在第 4 列。

我看不到使用 Sort() 方法的方法。有什么想法吗?

【问题讨论】:

  • 是的。但我什至在切换数据源。我在切换之前调用 DataSource = null 和 Columns.Clear。
  • 我希望能够允许刷新但保存排序顺序。但是,如果用户切换他们想要查看的内容(通过 TreeView),那么我希望排序顺序消失。这是一个错误吗?我已经尝试了一些方法,但我想不出办法让它消失。
  • 令人沮丧的是枚举 ListSortDirection 没有 .None 值,但 SortOrder 有。您使用 SortOrder 从 DataGridView 获取值,但使用 ListSortDirection 设置它。
  • 切换数据源将我的理论抛诸脑后。希望额外的信息能给你带来一些成功。

标签: .net winforms datagridview grid gridview-sorting


【解决方案1】:

我已经直接访问了 BindingSource 上的排序:

((BindingSource)_dgv.DataSource).Sort = string.Empty;

【讨论】:

  • 谢谢!我刚刚使用了 BindingSource.Sort = "" 并且效果很好。
【解决方案2】:

来自MSN Forums

DataGridView绑定的是DataView而不是直接绑定Table,所以需要设置:

DataTable.DefaultView.Sort = String.Empty

有效地清除表上的排序,从而清除绑定到它的网格。这似乎需要刷新 DataGridView,除非您使用的是 2005,然后您可以使用单独的绑定管理器。

【讨论】:

    【解决方案3】:

    不是一个直接的答案,但“未排序”当然没有很好的定义。您不能对(隐藏)列进行排序,例如 ID 吗?

    【讨论】:

    • 好主意。我确实有一个假列,在 DataAdapter 加载它之后添加到 DataTable 中,称为“row_number”,它用于分页(如果我选择打开它)。 +1。这可能是我的答案。
    • 结合数据源对“假”列进行排序有限制,请参阅 MSDN。
    【解决方案4】:

    在与 user2268720 的答案相同的域中.. 不是最干净的解决方案,但使用未绑定的 DGV 为我完成了这项工作:

                if (dgv.SortedColumn != null) {
                    DataGridViewColumn col = dgv.SortedColumn;
                    col.SortMode = DataGridViewColumnSortMode.NotSortable;
                    col.SortMode = DataGridViewColumnSortMode.Automatic;
                }
    

    【讨论】:

      【解决方案5】:

      尝试将网格的 itemsource 设置为 Nothing,然后再次将其设置回表格的 DefaultView

      【讨论】:

        【解决方案6】:

        我今天也遇到了这个问题。我有一个DataGridView,它会定期更换它的DataSourceDataTable)。当用户使用以下代码单击列标题时,我终于能够删除用户指定的排序:

            If dgv.SortedColumn IsNot Nothing AndAlso dgv.DataSource IsNot Nothing Then
                Dim dt_Sender As DataTable = DirectCast(dgv.DataSource, DataTable)
                dt_Sender.DefaultView.Sort = dt_Sender.Columns(0).ColumnName & " ASC"
            End If
        

        之所以起作用,是因为我的DataGridView 中有一个隐藏列,它始终位于列索引位置 0。它是基础数据的整数主键,恰好在数据加载时排序。

        *如果您还没有在DataTable 中命名您的索引列(例如,dt_Sender.Columns(0).ColumnName = "colIndex")。

        *如果您使用BindingSource 对象作为DataGridViewDataTable 之间的中介(正如许多人似乎所做的那样),那么您必须在第二行中适当地嵌套DirectCast (即,Dim dt_Sender As DataTable = DirectCast(dgv.DataSource, DataTable) 将更改为:Dim dt_Sender As DataTable = DirectCast(DirectCast(dgv.DataSource, BindingSource), DataTable))。

        *此外,如果您的 DataTable 恰好由没有整数主键(可能是 GUID?)的 SQL Server 查询填充,那么您可以更改其源查询以包含新的行号和然后隐藏DataGridView 中的新列。例如:

        SELECT Row_Number() OVER (ORDER BY (SELECT '')) AS RowNumber, Column1, Column2, Column3
        FROM SourceTable
        

        希望这个解决方案在未来对其他人有所帮助。

        【讨论】:

          【解决方案7】:
          /// C#
          /// Author : Jeudi Prando
          
          foreach (DataGridViewColumn column in this.DataGridView1.Columns)
          {
              column.SortMode = DataGridViewColumnSortMode.NotSortable;
              column.SortMode = DataGridViewColumnSortMode.Automatic;
          }
          

          【讨论】:

            猜你喜欢
            • 2011-12-30
            • 1970-01-01
            • 1970-01-01
            • 2010-12-06
            • 1970-01-01
            • 2011-03-12
            • 1970-01-01
            • 1970-01-01
            • 2019-07-21
            相关资源
            最近更新 更多