遗留报告运行时自动生成字段的应用程序问题

时间:2012-03-05 05:11:35

标签: asp.net activereports

我不知道以下代码片段是否打算以这种方式工作,因为有时我们“作为开发人员”尝试自动创建数据显示控件,其中字段数量不受控制且具有类似的数据绑定,所以在此之前检查一些人留下的应用程序:

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返回值限制的运行时中添加了多少字段/文本框来报告格式更改,例如:

  1. 返回SQLQuery值= 4
  2. 为详细的第1行生成了10个字段
  3. 第2行的6个字段
  4. 第3行的4个字段
  5. 详细信息字段绑定到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
    

    任何帮助将不胜感激

    非常感谢

1 个答案:

答案 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值在不同部分之间不一致(顶部是包含控件的部分顶部的垂直位置)

现在,听起来有时这些字段不会出现在报告中。您可以验证以解决问题的一些事项:

  • 确定是否存在绑定问题或视觉/位置问题。要做到这一点,只需给文本框一个边框或背景颜色,这样即使没有文本也可以看到它(由于数据绑定失败)。
  • 开始将每个文本框的位置和数据字段值注销到日志文件。当您发现问题时,请返回日志并查看是否可以确定触发问题的原因(可能是特定的索引,位置或数据字段值?)。
  • 最后,确保页面大小(由系统的默认打印机确定)不会改变,并且可能会切断一个动态添加的文本框。