silverlight分頁打印報表
在打印報表的時候經常會用到分頁,本文的報表是連續的多個報表按順序排列的,其中每個報表由三部分組成,第一部分是一個label,用於顯示報表標題,第二部分是一個label,用於顯示報表單位,第三部分是一個datagrid,用於顯示數據,
報表截圖如下圖所示:
現在想實現的功能是每個報表占一頁,一次性打印所有的報表。
實現此分頁打印的代碼如下:
PrintDocument _print = new PrintDocument(); List<UIElement> uis = new List<UIElement>(); _print.PrintPage += (s, args) => { StackPanel sp = new StackPanel(); while ( SP_ReportManagement.Children.Count > 0) { var ui = SP_ReportManagement.Children[0]; SP_ReportManagement.Children.RemoveAt(0); sp.Children.Add(ui); uis.Add(ui); sp.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); //當sp中已經包含一個報表或者包含的報表高度大於紙張高度就換頁 if (sp.Children.Count > 3 || (sp.DesiredSize.Height > args.PrintableArea.Height && sp.Children.Count > 1)) { sp.Children.Remove(ui); uis.Remove(ui); SP_ReportManagement.Children.Insert(0, ui); args.HasMorePages = true; break; } } args.PageVisual = sp; }; //把刪除的報表數據重新加入到SP_ReportManagement _print.EndPrint += (s, args) => { if (SP_ReportManagement.Children.Count > 0) { for (int i = uis.Count() - 1; i >= 0; i--) { //把標題和單位加入 if (i % 3 == 0 || i % 3 == 1) { Label ui = (Label)uis.ElementAt(i); ((StackPanel)ui.Parent).Children.Remove(ui); SP_ReportManagement.Children.Insert(0,ui); } //加入dagagrid表格數據 else { DataGrid ui = (DataGrid)uis.ElementAt(i); ((StackPanel)ui.Parent).Children.Remove(ui); SP_ReportManagement.Children.Insert(0,ui); } } } else { for (int i = 0;i < uis.Count;i++) { //把標題和單位加入 if (i%3==0 || i %3 ==1) { Label ui = (Label)uis.ElementAt(i); ((StackPanel)ui.Parent).Children.Remove(ui); SP_ReportManagement.Children.Add(ui); } //加入dagagrid表格數據 else { DataGrid ui = (DataGrid)uis.ElementAt(i); ((StackPanel)ui.Parent).Children.Remove(ui); SP_ReportManagement.Children.Add(ui); } } } uis.Clear(); }; _print.Print("Report Generating ......");
最後更新:2017-04-03 16:59:46