繁体   English   中英

旧版报表应用程序在运行时具有自动生成字段的问题

[英]Legacy report application problems with autogenerate fields in runtime

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

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个字段

详细信息字段绑定到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

任何帮助将不胜感激

非常感谢

在运行时在报表上动态创建字段非常好。 确实需要在reportstart事件更早的时间内(即在调用ActiveReport.Run之前)完成这些字段的创建。

但是,您可以放置​​相同的逻辑以在子报表中动态创建这些字段并也传递参数,但是一般而言,子报表会带来额外的开销(在大多数情况下,还会有额外的查询),因此除非有必要,否则我不会使用子报表引人注目的好处。 然而,在传递参数给子报表的演练在这里

在代码中唯一看起来可疑的是以下行:

 TB.Location =  new System.Drawing.PointF(Left, ((Label)rpt.Sections["PageHeader"].Controls["tbColorway1"]).Top);

您正在使用PageHeader中控件的Top值,但是TB在Detail部分中。 我可以理解重用Left值,但是重用Top值在不同部分之间并不一致(Top是从包含控件的部分顶部开始的垂直位置)

现在,听起来好像有时这些字段没有出现在报告中。 您可以验证一些事情来解决问题:

  • 确定是否存在绑定问题或视觉/位置问题。 为此,只需为文本框提供边框或背景色或其他内容,即使没有文本也可以看到它(由于数据绑定失败)。
  • 开始将每个文本框的位置和数据字段值记录到日志文件中。 当您发现问题时,请返回日志,看看是否可以找到引发问题的原因(可能是特定的索引,位置或数据字段值?)。
  • 最后,确保页面大小(由系统的默认打印机确定)没有改变,并且可能会切断您动态添加的文本框之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM