從事winform開發已經快三年了,這三年中兩年使用DevExpress控件進行winform系統開發,對Dev控件有自己的一些思考,下面就常用的表格控件GridControl的分頁進行一些討論。
在平時的系統開發中,對不對C/S系統中的列表進行分頁,我和同事也有不一樣的見解。同事認為C/S中Grid不必分頁,因為分頁會對數據的查看帶來不便,但是又會遇到數據量較大,傳輸的壓力,他傾向於使用查詢條件來約束查詢返回的數據量。我們的系統一開始也的確是這么實現的。不進行任何分頁處理,一次查詢出所有滿足條件的記錄。但是項目后期發現,我們的想法在一般的界面不會出現任何問題。但是極個別窗體會出現明顯的卡頓,數據量太大,簡直不忍直視,這使得我必須去找到一種合理的解決方式來改善這個問題。
傳統的分頁
我引用 我學習Dev控件時看的一篇帖子的一張圖,這張圖來自博客園中 伍華聰大哥 的 博客(多有冒犯,如對伍華聰大哥帶來不方便的地方,我立刻刪除。)
如何Windows分頁控件中增加統計功能
這種分頁方式是我們最最常見的一種方式,可以自由選擇查看的頁數和上一頁,下一頁,通用性較好且比較直觀,大方。
瀑布流的分頁
這種分頁方式有些借鑒網頁瀑布流,采用下拉滾動條或者使用鼠標滾輪來實現延時加載的方式,這種方式給用戶帶來的體驗會比傳統的方式好一些,如果控制每次加載的記錄條數合理,用戶完全感受不到數據時延遲加載的。
如何實現
熟悉Dev控件的朋友估計看出來了,這是一個默認設置的GridControl+GridView控件,要實現這個效果,首先我考慮的是如何檢測滾輪事件。通過谷歌找到Dev官方的問答找到了這么一個事件TopRowChanged,這個事件會在GridView中可見的首行記錄發生變化時觸發。沒錯,就是這個事件的貢獻幫助我們完成這種分頁模式。
下面就是方法的實現
int currentIndex = 1; int currentCount = -1; int totalCount = -1; VirtualData data = null; List<Student> StudentList = null; private void btnQuery_Click(object sender, EventArgs e) { data = new VirtualData(); gridView1.TopRowChanged += gridView1_TopRowChanged; currentIndex = 1; var dataSource = data.Query(currentIndex, out totalCount); StudentList = dataSource.ToList(); gridControl1.DataSource = StudentList; currentCount = StudentList.Count; this.labelControl1.Text = "記錄總數: " + totalCount.ToString(); } private void gridView1_TopRowChanged(object sender, EventArgs e) { if (gridView1.IsRowVisible(currentCount - 10) == DevExpress.XtraGrid.Views.Grid.RowVisibleState.Visible) { gridView1.TopRowChanged -= gridView1_TopRowChanged; var dataSource = data.Query(++currentIndex, out totalCount); StudentList.AddRange(dataSource); gridControl1.RefreshDataSource(); currentCount = StudentList.Count; if (dataSource.Count == 100) { gridView1.TopRowChanged += gridView1_TopRowChanged; } } }
總結:這兩種方式都有自己的優點,已經在上面進行了分析,當然,只有適合自己項目的方式才是好的方式。
我會在后面將上面的代碼進行封裝,夠成新的PageGridControl,方便調用。
最后,這是本人第一次發帖子,很多地方不懂,需要向各位博客園的朋友進行學習,所以你對這篇文章有什么意見和建議,歡迎留言,我會及時進行回復,但請噴子繞道。
最后發布Demo文件的鏈接: GridControlFlowDataDemo.rar