0

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

根据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
    
    第 1 页:
                         |字段 1|字段 2|字段 3|字段 4|
    -------------------------------------------------- ----
    第 1 行 | valA1 | valA2 | valA3 | valA4 |
    -------------------------------------------------- ----
    第 2 行 | valB1 | valB2 | valB3 | valB4 |
    -------------------------------------------------- ----
    第 3 行 | valC1 | valC2 | valC3 | valC4 |
    -------------------------------------------------- ----

    第2页 :
                         |字段 1|字段 2|字段 3|字段 4|
    -------------------------------------------------- ----
    第 1 行 | valA5 | valA6 | valA7 | valA8 |
    -------------------------------------------------- ----
    第 2 行 | valB5 | valB6 |
    -------------------------------------------------- ----
    第 3 行                 
    -------------------------------------------------- ----

    第 3 页:
                         |字段 1|字段 2|字段 3|字段 4|
    -------------------------------------------------- ----
    第 1 行 | valA9 | valA10|
    -------------------------------------------------- ----
    第 2 行                 
    -------------------------------------------------- ----
    第 3 行                 
    -------------------------------------------------- ----
//End of Report

任何帮助将不胜感激

非常感谢

4

1 回答 1

1

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

但是,您可以使用相同的逻辑在子报表中动态创建这些字段并传递参数,但通常子报表确实会带来额外的开销(在大多数情况下还有额外的查询),所以我不会使用子报表,除非有一个令人信服的好处。但是,这里有一个关于将参数传递给子报表的演练

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

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

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

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

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