DevExpress GridControl 使用瀑布加載方式加載數據


從事winform開發已經快三年了,這三年中兩年使用DevExpress控件進行winform系統開發,對Dev控件有自己的一些思考,下面就常用的表格控件GridControl的分頁進行一些討論。

在平時的系統開發中,對不對C/S系統中的列表進行分頁,我和同事也有不一樣的見解。同事認為C/S中Grid不必分頁,因為分頁會對數據的查看帶來不便,但是又會遇到數據量較大,傳輸的壓力,他傾向於使用查詢條件來約束查詢返回的數據量。我們的系統一開始也的確是這么實現的。不進行任何分頁處理,一次查詢出所有滿足條件的記錄。但是項目后期發現,我們的想法在一般的界面不會出現任何問題。但是極個別窗體會出現明顯的卡頓,數據量太大,簡直不忍直視,這使得我必須去找到一種合理的解決方式來改善這個問題。

傳統的分頁


我引用 我學習Dev控件時看的一篇帖子的一張圖,這張圖來自博客園中 伍華聰大哥 的 博客(多有冒犯,如對伍華聰大哥帶來不方便的地方,我立刻刪除。)

如何Windows分頁控件中增加統計功能

這種分頁方式是我們最最常見的一種方式,可以自由選擇查看的頁數和上一頁,下一頁,通用性較好且比較直觀,大方。

瀑布流的分頁


image

這種分頁方式有些借鑒網頁瀑布流,采用下拉滾動條或者使用鼠標滾輪來實現延時加載的方式,這種方式給用戶帶來的體驗會比傳統的方式好一些,如果控制每次加載的記錄條數合理,用戶完全感受不到數據時延遲加載的。

如何實現


熟悉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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM