silverlight分页打印报表

来源:互联网 发布:Java实验8抽象类与继承 编辑:程序博客网 时间:2024/05/17 04:09

在打印报表的时候经常会用到分页,本文的报表是连续的多个报表按顺序排列的,其中每个报表由三部分组成,第一部分是一个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 ......");