コントロール・ソート・イベントでDataViewおよびDataTableでソート
ASPをやっています.NETページの開発では、dataset(またはDataTable)がよく使われ、DataGridまたはGridViewにバインドされて並べ替えられ、並べ替えルールは配列fids要素の順に行われます.ここでは、ソートイベントにおいてDataViewおよびDataTableでソート機能を実現する方法について説明する.
一般の人のやり方はDataViewでソートし、キーコードは以下の通りです.
DataView dv = dt.DefaultView; dv.Sort="dis,公開日desc";
一般の人のやり方はDataViewでソートし、キーコードは以下の通りです.
DataView dv = dt.DefaultView; dv.Sort="dis,公開日desc";
然后把dv绑定到DataGird输出。
不过问题又来了,如果我们需要分页功能,在翻页时,我们需要ViewState等控件来保存状态啊.那么我们还是需要用到DataTable或DataSet, DataView本身不能被序列化,而DataView中的Table属性是未经排序的,所以它在这里不起作用.
于是有个菜鸟级土解决方法如下(只使用了简单的循环):
private DataTable SortTable(DataTable dt,string[] pids) { DataTable dt0 = dt.Clone(); //复制原表结构 for(int i=0;i<pids.Length;i++) { if(pids[i] != string.Empty) { DataRow[] drs = dt.Select("pos_id=" + pids[i]); if(drs.Length > 0) { foreach(DataRow dr in drs) { dt0.ImportRow(dr); //导入行 } } } } return dt0; }
说明:就是对排序的数组循环,在datatable中找对应的行,然后复制到新表中。
该方法的效率还是可以的,不过如果交集次数大于20,000,000的时候,就会有效率问题.
其实啊,新近版的.NET类库里的DataRow[]集合对象中已经有个CopyToDataTable方法可以解决DataTable排序问题,在控件的排序事件中实现如下代码:
string currentSortColumn = this.SortColumn;// ViewState this.SortColumn = e.SortExpression; if (currentSortColumn == this.SortColumn) this.SortAscending = !this.SortAscending;// ViewState else this.SortAscending = false; DataTable dt = (DataTable)ViewState["DataSource"]; DataRow[] filter = dt.Select("",this.SortColumn + " " + (this.SortAscending? "ASC" : "DESC")); DataTable newTable = filter.CopyToDataTable(); ViewState["DataSource"] = newTable; this.BindDateGrid();
しかし、CopyToDataTableの効率が十分かどうかは分かりません.