我不知道以下代码片段是否打算以这种方式工作,因为有时我们“作为开发人员”尝试自动创建数据显示控件,其中字段数量不受控制且具有类似的数据绑定,所以在此之前检查一些人留下的应用程序:
在ActiveReport_ReportStart()
事件下:
for (Ind = 1; Ind <=CM.Length; Ind++) {
if (Ind == 1) {
Left = ((Line)rpt.Sections["PageHeader"].Controls["lnH8"]).Left + 0.05f;
} else if (Ind == 2) {
Left = ((Line)rpt.Sections["PageHeader"].Controls["lnH9"]).Left + 0.05f;
} else if (Ind == 3) {
Left = ((Line)rpt.Sections["PageHeader"].Controls["lnH10"]).Left + 0.05f;
}
TextBox TB = new TextBox();
TB.Size = ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Size;
TB.Font = ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Font;
TB.Width = ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Width;
TB.Height = ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Height;
TB.VerticalAlignment = VerticalTextAlignment.Top;
TB.Location = new System.Drawing.PointF(Left, ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Top);
TB.DataField = "ColorText" + Ind + ColorwayNumber;
rpt.Sections["Detail"].Controls.Add(TB);
预览时没有编译错误,也没有正确显示其他非自动生成的字段(ReporHeader,ReportFooter),但恕我直言,我认为最好通过详细信息部分内的子报表替换此机制,当然,这些字段必须显示在报告的“详细信息”部分中。无论如何我想看到一些建议,因为如果有可能在运行时自动生成文本框或标签我将不得不向老板解释为什么这个代码不起作用,如果我必须使用子报告,我需要知道如何传递参数(至少我需要使用两个参数来为它生成另一个sql查询)以及将脚本放入其中的“事件”是适当的。
在我发现最重要的问题是通过在sqlquery返回值限制的运行时中添加了多少字段/文本框来报告格式更改,例如:
详细信息字段绑定到SQL存储过程*
报告将以这种方式打印/显示:
//Report Init
Page 1 : |field 1|field 2|field 3|field 4| ------------------------------------------------------ row1 | valA1 | valA2 | valA3 | valA4 | ------------------------------------------------------ row2 | valB1 | valB2 | valB3 | valB4 | ------------------------------------------------------ row3 | valC1 | valC2 | valC3 | valC4 | ------------------------------------------------------ Page 2 : |field 1|field 2|field 3|field 4| ------------------------------------------------------ row1 | valA5 | valA6 | valA7 | valA8 | ------------------------------------------------------ row2 | valB5 | valB6 | ------------------------------------------------------ row3 ------------------------------------------------------ Page 3 : |field 1|field 2|field 3|field 4| ------------------------------------------------------ row1 | valA9 | valA10| ------------------------------------------------------ row2 ------------------------------------------------------ row3 ------------------------------------------------------
//End of Report
任何帮助将不胜感激
非常感谢
答案 0 :(得分:1)
在运行时动态创建报表上的字段是完全可以的。这些字段的创建确实需要在之前的reportstart事件或中完成(即在调用ActiveReport.Run之前)。
但是,您可以使用相同的逻辑在子报表中动态创建这些字段并传递参数,但通常子报表确实会产生额外的开销(在大多数情况下会增加额外的查询),所以我不会使用子报告,除非有令人信服的好处。但是,有一个关于将参数传递给子报告here的演练。
您的代码中唯一可疑的是以下行:
TB.Location = new System.Drawing.PointF(Left, ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Top);
您正在使用PageHeader中控件的Top
值,但TB
位于详细信息部分。我可以理解重用Left值,但重复使用Top值在不同部分之间不一致(顶部是包含控件的部分顶部的垂直位置)
现在,听起来有时这些字段不会出现在报告中。您可以验证以解决问题的一些事项: