2011-02-15 58 views
66

我需要在内存中根据来自GridView的列和方向使用DataTable。该功能需要如下所示:如何对给定列和方向的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; 
    } 

回答

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

+0

损坏的链接排序中... 。 – Ash 2013-09-27 12:13:49

+1

已更新的回答。谢谢。 – 2013-09-27 13:09:38

7

数据表有一个重载的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/

60

如果你只得到了一个数据视图,您可以排序使用来代替:

table.DefaultView.Sort = "columnName asc"; 

还没有尝试过,但我你可以用任意数量的DataView来做到这一点,只要你参考了正确的一个。

+0

太棒了!这个解决方案的工作原理比所有这些自定义排序方法都容易10倍 – user1985189 2013-03-05 19:09:07

101

我认为的 “方向” 为 “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; 
} 
12

实际上得到了同样的问题。对我来说,工作这么简单的方法:

的数据添加到一个Datatable和排序是:

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

如果你要多于一个方向

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