Blazor第7天_Blazor自訂元件實作_共用分頁元件

 

用來儲存每一頁要顯示特定筆數分頁結果的資料結構

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Text;

namespace Common.Pagination
{
    /// <summary>
    /// TODO:分頁機制:Add by Samuel 用來儲存每一頁要顯示特定筆數分頁結果的資料結構
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public struct PagingResult<T>
    {
        public IEnumerable<T> Records { get; set; }
        public int TotalRecords { get; set; }

        public PagingResult(IEnumerable<T> items, int totalRecords)
        {
            Records = items;
            TotalRecords = totalRecords;
        }
    }
}


儲存下面分頁元件的資料結構

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using System.Collections.Generic;
using System.Text;

namespace Common.Pagination
{
    /// <summary>
    /// TODO:分頁機制:Add by Samuel 用來儲存下面分頁元件的資料結構
    /// </summary>
    public class PagerBase
    {
        /// <summary>
        /// 使用分頁的網址
        /// </summary>
        public string Url { get; set; }

        /// <summary>
        /// 總共建立了多少頁:記錄總數 / 10 (顯示在一頁上)
        /// </summary>
        public int PageCount { get; set; } = 5;

        /// <summary>
        /// 記錄計數:指定當前表中的記錄數
        /// </summary>
        public int RecordCount { get; set; } = 50;

        /// <summary>
        /// 頁面大小:確定要在頁面上顯示的記錄數
        /// </summary>
        public int PageSize { get; set; } = 10;

        /// <summary>
        /// 頁索引:目前顯示的頁碼的索引(頁碼 - 1)
        /// </summary>
        public int PageIndex { get; set; } = 0;

        /// <summary>
        /// 頁碼:目前顯示 頁碼:頁碼 1,頁 2,...
        /// </summary>
        public int PageNumber { get; set; } = 1;

        /// <summary>
        /// 顯示多少個頁面按鈕?
        /// </summary>
        public int PagerButtonCount { get; set; } = 3;

        #region 搜索與資料列表相關的欄位屬性
        /// <summary>
        /// 如果是預設清單,則為 false,如果搜尋結果的分頁清單為 true
        /// </summary>
        public bool SearchMode { get; set; } = false;

        /// <summary>
        /// 要查找的欄位名稱(標題)
        /// </summary>
        public string SearchField { get; set; } = "";

        /// <summary>
        /// 要查找的內容
        /// </summary>
        public string SearchQuery { get; set; } = "";
        #endregion
    }
}


再來第三步驟就要自己去撰寫設定了

自訂Model類別回填PagingResult,會回傳自訂Model列表與總筆數for分頁機制計算依據。
由於設計上採用泛型因此不會侷限特定某個Model Class。

通常該方法可能寫在某支Service 類別中做資料存取的呼叫

1
2
3
4
5
6
7
8
9
public PagingResult<自訂Model類別> GetXXXModel_ByPaging(..其他filter參數.., int pageIndex, int pageSize)
{
    var query = ..你的ef core linq 查詢語句..

    var TotalRecords = query.Count();
    var 自訂Model類別s = query.Skip(pageIndex * pageSize)
                                .Take(pageSize).ToList();
    return new PagingResult<自訂Model類別>(自訂Model類別s, TotalRecords);
}



外部使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<div class="col-md-12">
    <PagerComponent Model="pager" PageIndexChanged="PageIndexChanged"></PagerComponent>
</div>


List<自訂Model類別> 自訂Model類別s;
private PagerBase pager = new PagerBase()
{
    PageNumber = 1,
    PageIndex = 0,
    PageSize = 2,
    PagerButtonCount = 2
};

void GetPagingData()
{
    PagingResult<自訂Model類別> pagingData = XXXService.GetXXXModel_ByPaging(..其他filter參數.., pager.PageIndex, pager.PageSize);
    pager.RecordCount = pagingData.TotalRecords;
    自訂Model類別s = pagingData.Records.ToList();
}

private async void PageIndexChanged(int pageIndex)
{
    pager.PageIndex = pageIndex;
    pager.PageNumber = pageIndex + 1;
    GetPagingData();

    StateHasChanged();
}



效果






留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題