關於怎樣獲取DevExpress GridView過濾後或排序後的資料集問題
阿新 • • 發佈:2019-02-03
GridView用自帶的過濾功能過濾資料後,想要獲取過濾後的資料集,有兩種方式:
一、笨辦法就是迴圈遍歷GridView,根據gridView.GetRow()或者gridView.GetDataRow()(該方法返回DataRow型別,使用於資料來源是DataTable)去獲取指定handle對應的資料物件。
1、若GridControl繫結的資料來源是List型別,可以呼叫以下方法
/// <summary> /// 獲取GridView過濾或排序後的資料集 /// </summary> /// <typeparam name="T">泛型物件</typeparam> /// <param name="view">GridView</param> /// <returns></returns> public IEnumerable<T> GetGridViewFilteredAndSortedData<T>(DevExpress.XtraGrid.Views.Grid.GridView view) where T : class { var list = new List<T>(); for (int i = 0; i < view.RowCount; i++) { if (view.IsGroupRow(i)) continue; var entity = view.GetRow(i) as T; if (entity == null) continue; list.Add(entity); } return list; }
2、若GridControl繫結的資料來源是DataTable型別,可以呼叫以下方法:
<pre name="code" class="csharp"> /// <summary> /// 獲取GridView過濾或排序後的資料集 /// </summary> /// <param name="view">GridView</param> /// <returns></returns> public DataTable GetGridViewFilteredAndSortedDataToDataTable(DevExpress.XtraGrid.Views.Grid.GridView view) { DataTable _dt = view.GridControl.DataSource as DataTable; if (_dt == null) return null; DataTable dt = _dt.Clone(); for (int i = 0; i < view.RowCount; i++) { if (view.IsGroupRow(i)) continue; var dr = view.GetDataRow(i); if (dr == null) continue; dt.Rows.Add(dr.ItemArray); } return dt; }
第二種方法:估計大夥很難找到,DevExpress 的GridView竟然提供了相應的方法,但是奇怪的是編譯器竟然沒有顯示,就是在GridView的基類BaseView中提供了DataController這個物件,查看了這個屬性後發現竟然真的被遮蔽了,EditorBrowsable竟然是Never狀態(我也表示一臉懵逼)
當然,遮蔽了,不代表他沒有這個屬性,那就一臉懵逼的使用吧,DataController提供一個獲取過濾後和排序後的資料集的方法:GetAllFilteredAndSortedRows()
為了不每次都懵逼的去這樣直接呼叫,最好還是寫一個公用方法去呼叫吧
<pre name="code" class="csharp"> /// <summary> /// 獲取GridView過濾或排序後的資料集 /// </summary> /// <param name="view"></param> /// <returns></returns> public System.Collections.IList GetGridViewFilteredAndSortedData(DevExpress.XtraGrid.Views.Grid.GridView view) { return view.DataController.GetAllFilteredAndSortedRows(); }