当前位置: 首页 > 工具软件 > RDLC > 使用案例 >

RDLC 使用经验谈

诸葛嘉熙
2023-12-01

以前在用devExpress 的报表控件. 由于需要注册.费用. 而且里面的报表控件有bug 会无辜多出来几个空白页面. 实在解决不了了. 于是研究了RDLC.

指南部分.
我对RDLC总的感觉是. RDL 报表描述语言是起源于sqlserver 的报表服务器.
所以它不可避免的更倾向于 系统IT维护人员的工作模式. 直接SQL连接数据库,然后取出DataTable. 再设计个报表视图模版. 只是还需要再 写点代码粘合一下视图和数据源. 就出来报表了..

所以… 企图 使用面向对象的方式 先设计好层级数据结构然后渲染出报表的想法. 是不太适合RDLC的. 当然硬要做也是可以的. 但是效果也达不到太高级的地步.

层级关系 需要使用 Table 控件的分组功能. 或者子报表的层级关系. 子报表可以嵌套子报表的.

我个人觉得,
子报表实现层级模式更适合程序员.
Table控件的分组功能更适合 IT维护人员.

当然 表控件 的 分组功能非常强大
矩阵的 数据钻取功能也非常强大 类似Excel的透视图.

单表数据显示没啥好讲的. 半个小时自己研究下就出来了.

下面记录一些常见的错误.

报表数据面板的显示
RDLC的数据源在设计模式下是可变的. 需要在 “报表数据” 面板中修改. 打开步骤
1.打开任何一个rdlc文件 然后点击 vs 菜单栏-> 视图->最下面的 报表数据
就出来了. 重点是要点击rdlc文件. 否则视图菜单里看不到 报表数据 选项.

1.子报表的使用部分.
子报表和主报表之间的数据关联是通过 右击子报表->子报表属性->参数选项卡. 添加参数的. 主报表根据这个配置把数据源中的数据依次赋值给你的参数. 然后传递到子报表中. 这里特别提示一点. 子报表中不要忘记添加参数.参数名要一样. 否则显示: “错误:无法显示子报表”

子报表的子报表的数据源如何赋值?
请看下面的例子如何处理Report2 和Report3 的数据源.
报表的嵌套关系为.
Report1
—–Repote2
———–Repote3
子报表的数据源是通过事件reportViewer1.LocalReport.SubreportProcessing委托进行处理的.


        private void RDLC_Load(object sender, EventArgs e)
        {


            //绑定报表
            reportViewer1.LocalReport.ReportPath = "C:\\WindowsFormsApplication1\\Report1.rdlc";

            //绑定子报表的数据源
            reportViewer1.LocalReport.SubreportProcessing +=
                     new SubreportProcessingEventHandler(DemoSubreportProcessingEventHandler);

            //注意dataset1必须和你报表所引用的table 一致  

            reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("ybxx", LoadDemoData()));//注意这里的name和报表中的数据集的名称一致,否则会提示错误.数据集 ybxx未初始化

            //reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("xj_xmcdz", LoadDemoData2()));//注意这里的name和报表中的一致 

            reportViewer1.LocalReport.Refresh();

            //导出 start   如果要导出的话,打开这部分就够了.byte[] bytes 里面就是pdf文件的内容. 保存到文件即可.
            //Warning[] warnings;
            //string[] streamids;
            //string outType = "Pdf";//可以是 Word,Excel,Pdf
            //string mimeType;
            //string encoding;
            //string extension;

            //byte[] bytes = reportViewer1.LocalReport.Render(
            //    outType, null, out mimeType, out encoding, out extension,
            //    out streamids, out warnings);
            //导出 end
            this.reportViewer1.RefreshReport();

        }

        private void DemoSubreportProcessingEventHandler(object sender, SubreportProcessingEventArgs e)
        {

                //二级报表的name == Report2
              if (e.ReportPath == "Report2")
            {
                var ybbh = e.Parameters["ybbh"].Values[0];
                //var dt = LoadDemoData2(ybbh);

                //var dbxmcdz = wswDB.xj_xmcdz
                //         .Where(a => a.ybbh == ybbh)// &&  a.jglx != "ym")
                //         .ToList()
                //         .Select(a => new WSW_CultureResultModel()
                //         {
                //             CultureResultType = ViewChange_jglx(a.jglx),
                //             Microbes = a.xjmc,
                //             ResultExplain = a.ybjg,
                //             DrugSensitivityTestId = a.lxxh  //当a.jglx为ya (阳性)的时候说明,需要再做药敏测试.然后根据 lxxh 加载药敏测试数据
                //         })
                //        .ToList();

                e.DataSources.Add(new ReportDataSource("xj_xmcdz", LoadDemoData2(ybbh)));
            }
            //三级报表的name == Report3
            if (e.ReportPath == "Report3")
            {
                 e.DataSources.Add(new ReportDataSource("xj_xmcdz", LoadDemoData2())); //加载三级报表的数据
            }

        }

RDLC 报表会出现空白页面的可能原因.
子报表的宽度 超过父报表的宽度. 导致出现新的空白页面.

 类似资料: