如何按列和方向对DataTable进行排序?

80

我需要根据从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;
   }
6个回答

118

我假设“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中的表格消失了... - N romaai
嗯,看起来它正在覆盖tableStyles.GridColumnStyles。 - N romaai
3
第二个代码块可以简化为 dt.DefaultView.ToTable(); - MattD

74

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

table.DefaultView.Sort = "columnName asc";

我没有尝试过,但我猜你可以使用任意数量的数据视图来做到这一点,只要你引用正确的那个。


太好了!这个解决方案可行,而且比所有自定义排序方法简单10倍。 - user1985189
不确定为什么其他解决方案获得了更多的赞,但如果您来到这个帖子,那么这就是您需要的。谢谢Alex。它有效。 - kuklei

21

我其实遇到了同样的问题。对我来说,这种简单的方法有效:

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

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

7

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

如果您想按多个方向进行排序

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

4
创建一个DataView。您不能直接对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);

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