坎尼就是一直為這個排序事件苦惱
雖然從 VS 2003 時代 升級上來 VS 2005,DataGrid 也多了個兄弟叫 GridView
可是這個Sort事件一直沒有更簡單的寫法
(不要提 DataSource 那個會讓坎尼變精靈工程師的東西)
看看那個 Paging 事件,人家只要簡單的兩行就可解決
gv.PageIndex = e.NewPageIndex;
gv.DataBind();
坎尼一直天真的認為,Sorting應該也是這麼人性化才對
gv.SortDirection= SortDirection.Ascending;
gv.SortExpression = e.SortExpression;
gv.DataBind();
恩、Exception? gv.SortDirection 及 gv.SortExpression 為 唯讀 (翻桌)
後來坎尼去問了 估狗 大神
看到大家都是在Sorting做完判斷,再丟去另外個函式重新Bind
但是坎尼遇到的情況是,同一個Gridview會有兩種以上的DataSource
所以想出了下面這個方法 (當然部分是參考別人的寫法)

一樣要來解釋一下 (雖然註解都寫的差不多了)
首先,先取得 gv.DataSource 並放到一個 DataView 之中
再來,取得用 ViewState 記錄的 SortDirection 和 SortExpression
接著,再判斷如何排序 (方式請見上圖註解)
最後,利用 DataView.Sort 屬性進行排序,再 Bind 回 Gridview
別忘了把目前的 SortDirection 和 SortExpression 記錄在 ViewState中
好了 排序完成 收功
不過目前這個排序判斷版本仍稍為有點問題
可能要加上更加精確的判斷
只是坎尼目前修別人的bug已經修到腦子裡都是漿糊了
方法各位就請自行補完吧 哈 ^^
補充一點 (剛剛發現的)
圖裡的 gv.DataSource 可以直接用 DataView 來接
是因為坎尼在繫結事件時是寫 gv.DataSource = ds.Table[0].DefaultView;
若是寫成 gv.DataSource = DataSet1; (或是 gv.DataSource = DataTable1;)
此時在程式裡的 gv.DataSource 轉型就要注意
再補充一點
這段code只能用在只排序不分頁的事件中
所以....
並不適用於坎尼的這個case中
啊啊 又要想新的解法了 Orz
沒有留言:
張貼留言