【问题标题】:How do you Sort a DataTable given column and direction?如何对给定列和方向的 DataTable 进行排序?
【发布时间】:2011-02-15 15:31:23
【问题描述】:

我需要在内存中使用基于来自 GridView 的列和方向的 DataTable。该函数需要如下所示:

public static DataTable resort(DataTable dt, string colName, string direction)
{
    DataTable dtOut = null;

    ....
}

我需要帮助填写此功能。我想我可以使用 Select 语句,但我不确定如何使用。由于此浏览器,我无法单击“评论”,但您可以向我展示就地或新的 DataTable 解决方案,任一种。请给我指点的人,我需要一个类似于原型的编码函数。

怎么样:

// ds.Tables[0].DefaultView.Sort="au_fname DESC";
   public static void Resort(ref DataTable dt, string colName, string direction)
   {
        string sortExpression = string.Format("{0} {1}", colName, direction);
        dt.DefaultView.Sort = sortExpression;
   }

【问题讨论】:

    标签: c# ado.net datatable


    【解决方案1】:

    我假设“direction”是“ASC”或“DESC”,并且 dt 包含一个名为“colName”的列

    public static DataTable resort(DataTable dt, string colName, string direction)
    {
        DataTable dtOut = null;
        dt.DefaultView.Sort = colName + " " + direction;
        dtOut = dt.DefaultView.ToTable();
        return dtOut;
    }
    

    或不创建 dtOut

    public static DataTable resort(DataTable dt, string colName, string direction)
    {
        dt.DefaultView.Sort = colName + " " + direction;
        dt = dt.DefaultView.ToTable();
        return dt;
    }
    

    【讨论】:

    • 这似乎第一次有效,但随后无效。当我将我的 defaultView.Sort 第二次设置为不同的列方向时,gridView 中的表格消失了....
    • 嗯,看起来它正在覆盖 tableStyles.GridCOlumnStyles
    • 您还可以简化第二个代码块,简单地返回dt.DefaultView.ToTable();
    【解决方案2】:

    如果您只有一个 DataView,则可以使用它进行排序:

    table.DefaultView.Sort = "columnName asc";
    

    没有尝试过,但我想你可以使用任意数量的 DataView 来做到这一点,只要你引用正确的。

    【讨论】:

    • 太棒了!此解决方案有效,并且比所有这些自定义排序方法简单 10 倍
    • 不知道为什么另一个解决方案有更多的赞成票,但如果你来到这个帖子,这就是你所追求的。谢谢亚历克斯。它有效。
    【解决方案3】:

    实际上遇到了同样的问题。对我来说,这种方法很简单:

    将数据添加到Datatable 并对其进行排序:

    dt.DefaultView.Sort = "columnname";
    dt = dt.DefaultView.ToTable();
    

    【讨论】:

      【解决方案4】:

      DataTables 有一个重载的 Select 方法,您可以这样做。见这里:http://msdn.microsoft.com/en-us/library/way3dy9w.aspx

      但是 Select 调用的返回值不是 DataTable 而是 RowData 对象的数组。如果要从函数中返回 DataTable,则必须基于该数据数组从头开始构建它。这是一篇针对这两个问题并提供示例的帖子:http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/157a4a0f-1324-4301-9725-3def95de2bf2/

      【讨论】:

        【解决方案5】:

        创建一个数据视图。您不能直接对 DataTable 进行排序,但可以从 DataTable 创建一个 DataView 并对其进行排序。

        创建:http://msdn.microsoft.com/en-us/library/hy5b8exc.aspx

        排序:http://msdn.microsoft.com/en-us/library/13wb36xf.aspx

        以下代码示例创建一个显示所有产品的视图 其中库存单位数量小于或等于 重新订购级别,首先按供应商 ID 排序,然后按产品名称排序。

        DataView prodView = new DataView(prodDS.Tables["Products"], "UnitsInStock <= ReorderLevel", "SupplierID, ProductName", DataViewRowState.CurrentRows);

        【讨论】:

        • 更新了答案。谢谢。
        【解决方案6】:

        如果你想在多个方向排序

          public static void sortOutputTable(ref DataTable output)
                {
                    DataView dv = output.DefaultView;
                    dv.Sort = "specialCode ASC, otherCode DESC";
                    DataTable sortedDT = dv.ToTable();
                    output = sortedDT;
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-06
          • 1970-01-01
          • 2020-12-22
          • 1970-01-01
          • 2013-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多