0

我在正确进行格式化方面遇到了一些麻烦。我相信这源于对我试图做出改变的事件的错误理解。

任何方向都会很棒

    private void so_FetchData(object sender, FetchEventArgs eArgs)
    {
        if (m_so != null && m_so.Rows.Count > (m_soRowCount + 1))
        {
            DataRow soDr = m_so.Rows[m_soRowCount++];
            if (soDr != null)
            {
                var compResID = (int) soDr["CompResID"];
                var result = (ComplianceLevel) soDr["Result"];
                var sectNum = (int) soDr["JobSectType"];
                var sectName = soDr["S" + sectNum + "Name"] as string;
                var sectTxt = soDr["S" + sectNum + "Text"] as string;

                Fields["CompLev"].Value = (result == ComplianceLevel.OtherThanSerious) ? "Other Than Serious" : result.ToString();

                m_sectInfo = new SectInfo(sectName, sectTxt);
                m_causes = new Causes(compResID);
                m_actions = new Actions(compResID);
                subReport1.Report = m_sectInfo;
                subReport2.Report = m_causes;
                subReport3.Report = m_actions;
                eArgs.EOF = false;
            }
        }
        else
        {
            eArgs.EOF = true;
        }
    }

    private void eh_BeforePrint(object sender, EventArgs e)
    {
        //decide where the bottom border should be draw to
        if (m_actions != null && m_actions.ShouldShowBottBorder)
        {
            subReport3.Border.BottomStyle = BorderLineStyle.ThickSolid;
            subReport2.Border.BottomStyle = BorderLineStyle.Solid;
        }
        else if (m_causes != null && m_causes.ShouldShowBottBorder)
        {
            subReport2.Border.BottomStyle = BorderLineStyle.ThickSolid;
        }
        else
        {
            subReport1.Border.BottomStyle = BorderLineStyle.ThickSolid;
        }
    }

问题是每次我单步执行 eh_BeforePrint 方法时,即使我单步执行子报告并且正确设置了值,这些值也始终等于 false。发生了什么导致 bool 属性重置为 false?

如果每个子报表的 Fetch_Data 方法中有要打印的记录,只需更改它即可。

    private void Causes_FetchData(object sender, FetchEventArgs eArgs)
    {
        if (m_pos < m_corrs.Count)
        {
            if (!ShouldShowBottBorder)
                ShouldShowBottBorder = true;
            //...
         } 
     }
4

1 回答 1

2

您不能保证 BeforePrint 事件恰好在相应的 FetchData 事件之后引发。例如,FetchData 可能会为多条记录触发多次,但由于布局引擎中的一些保持逻辑,在 ActiveReports 知道它将提交一个节到哪个页面之前可能需要多条记录。因此,在引发相应的 BeforePrint 事件之前为多个事件引发 FetchData 是很常见的。

如果我正确理解您的代码,则会出现更大的问题。您似乎正在计算子报表中的值(m_causes 和 m_actions 似乎是实际的子报表)。如果是这种情况,您将无法可靠地计算子报表中的值并将它们传递给父报表。相反,您需要在父报表中计算这些值。但是,通常您可以添加一些共享函数来计算值并从父报表中调用它,然后将该值传递给子报表。

如果您对此有具体问题,请在此处评论并提供更多信息。

在不相关的说明中,如果您更改初始化子报表的方式,您可以获得相当显着的性能提升。始终在 ReportStart 事件中初始化您的子报表,然后在包含 Subreport 控件的部分的格式事件中设置它们的数据。这样,您将每个子报表初始化一次,而不是为每条记录初始化每个子报表。例如:

private void so_ReportStart()
{
    subreport1.Report = new SectInfo();
    subreport2.Report = new Causes();
    subreport3.Report = new Actions();
}
private void Detail_Format()
{ // assuming Detail is the section containing your subreports:

    ((SectInfo)subreport1.Report).SetParameters(Fields["sectName"].Value, Fields["sectTxt"].Value);
    ((Causes)subreport2.Report).SetParameters(Fields["compResID"].Value);
    ((Actions)subreport3.Report).SetParameters(Fields["compResID"].Value);
}

您将在 FetchData 中设置这些“字段”值,类似于您现在初始化子报表的方式。类似于以下内容:

private void so_FetchData(object sender, FetchEventArgs eArgs)
{
    if (m_so != null && m_so.Rows.Count > (m_soRowCount + 1))
    {
        DataRow soDr = m_so.Rows[m_soRowCount++];
        if (soDr != null)
        {
            var compResID = (int) soDr["CompResID"];
            var result = (ComplianceLevel) soDr["Result"];
            var sectNum = (int) soDr["JobSectType"];
            var sectName = soDr["S" + sectNum + "Name"] as string;
            var sectTxt = soDr["S" + sectNum + "Text"] as string;

            Fields["CompLev"].Value = (result == ComplianceLevel.OtherThanSerious) ? "Other Than Serious" : result.ToString();
            /** BEGIN NEW CODE **/
            Fields["sectName"].Value = sectName;
            Fields["sectTxt"].Value = sectTxt;
            Fields["compResID"].Value = compResId;
            /** END NEW CODE **/

            /** OLD CODE:
            m_sectInfo = new SectInfo(sectName, sectTxt);
            m_causes = new Causes(compResID);
            m_actions = new Actions(compResID);
            subReport1.Report = m_sectInfo;
            subReport2.Report = m_causes;
            subReport3.Report = m_actions;
            **/     
            eArgs.EOF = false;
        }
    }
    else
    {
        eArgs.EOF = true;
    }
}

要了解有关 ActiveReports 中事件的更多信息,请参阅ActiveReports 联机帮助中的报告事件概念主题。要了解有关将数据传递到子报表的更多信息,请参阅 ActiveReports 联机帮助中的带有运行时数据源的子报表。

Scott Willeke
GrapeCity inc.
于 2010-12-01T03:39:11.833 回答