1. 程式人生 > 實用技巧 >【原創】分享一種WPF列表資料的分頁列印方案

【原創】分享一種WPF列表資料的分頁列印方案

核心想法:基於模板,資料與樣式分離,不希望把資料和樣式混在一起拼接。

模板,使用WPF的普通Page頁即可,樣式佈局直接使用現有的。

資料,通過DataContext繫結到頁面上。

原理很簡單,下面貼一下程式碼或截圖。

模板頁(一個很普通的WPF頁面):

簡單寫了一個列印類及相應方法。

    /// <summary>
    /// 基於模板的列印
    /// </summary>
    /// <typeparam name="T">模板頁型別</typeparam>
    public class TemplatePrint<T>
        where T : Page , new()
        
    {
        /// <summary>
        /// 列印
        /// </summary>
        /// <param name="data">資料</param>
        /// <param name="pageSize">分頁時需要知道每頁顯示多少條記錄</param>
        /// <returns></returns>
        public string Print<TItem>(PrintBaseData<TItem> data, int pageSize = 20) where TItem : class
        {
            try
            {
                if (data == null || data.Items == null || data.Items.Count() == 0)
                {
                    return "無效資料";
                }
                if (pageSize <= 0)
                {
                    pageSize = 20;
                }

                PrintDialog printDialog = new PrintDialog();

                //計算總頁數
                int pageCount = (int)Math.Ceiling((double)data.Items.Count() / pageSize);
                var allData = data.Items.ToList();
                for (int i = 0; i < pageCount; i++)
                {
                    data.Items = allData.Skip(i * pageSize).Take(pageSize).ToList();
                    var element = new T() { DataContext = data };
                    printDialog.PrintVisual(element, $"資訊列印");
                    System.Threading.Thread.Sleep(200);
                }

                return "";
            }
            catch (Exception err)
            {
                return err.Message;
            }
        }
       

    }

  列印類是個泛型類,型別即是模板型別,這裡列印類及方法的設計力求做到抽象通用。

  下面提供了列印方法需要的列印資料的基類。

/// <summary>
    /// 列印資料
    /// </summary>
    /// <typeparam name="TItem">列表項型別</typeparam>
    public class PrintBaseData<TItem> where TItem : class
    {
        public string Title { get; set; }

        public IEnumerable<TItem> Items { get; set; }
    }

  

下面是列印功能呼叫的程式碼。

var testData = new List<QueryInfo>();
            var aarea = new[] { "A", "B", "C", "D", "F" };
            for (int i = 0; i < 100; i++)
            {
                testData.Add(new QueryInfo()
                {
                    AreaNo = $"{aarea[i % 4]}區",
                    ContainerNo = $"{10 + i + ""}",
                    PositionName = $"{101 + i + ""}",
                    DrugName = $"{"藥品名" + i}",
                    DrugSpec = $"{i + 'g'}",
                    StorageStatus = $"{i + 1}"
                });
            }
            var printData = new PrintBaseData<QueryInfo>()
            {
                Title = "",
                Items = testData
            };
            new TemplatePrint<QueryPrintTemplate>().Print(printData, 50);

  就是這樣,程式碼很簡單,思想也簡單,使用也簡單。

之前研究學習了DocumentPaginator,折騰了半天,用不好,放棄了。[裂開]