如何排序给定列和方向的数据表?


71

我需要在内存中使用基于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;
   }

Answers:


105

我假设“ 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 2013年

嗯,看起来好像是在覆盖tableStyles.GridCOlumnStyles
N romaai 2013年

3
您还可以简化第二个代码块以简单地返回dt.DefaultView.ToTable();
MattD

67

如果只有一个DataView,则可以使用该视图进行排序:

table.DefaultView.Sort = "columnName asc";

还没有尝试过,但是我想只要您引用正确的DataView,就可以使用任意数量的DataView进行此操作。


大!此解决方案有效,并且比所有这些自定义排序方法都容易10倍
user1985189 2013年

不知道为什么其他解决方案有更多支持,但这是您进入此主题后所追求的。谢谢亚历克斯。有用。
kuklei '16

15

其实有同样的问题。对我来说,这种简单的工作方式是:

将数据添加到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/


4

创建一个数据视图。您不能直接对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);


1
更新的答案。谢谢。
Jakub Konecki 2013年

2

如果您想在多个方向上排序

  public static void sortOutputTable(ref DataTable output)
        {
            DataView dv = output.DefaultView;
            dv.Sort = "specialCode ASC, otherCode DESC";
            DataTable sortedDT = dv.ToTable();
            output = sortedDT;
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.