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イベントでサブレポートを初期化し、サブレポートコントロールを含むセクションのformatイベントでデータを設定します。このようにして、すべてのレコードの各サブレポートを初期化する代わりに、各サブレポートを1回初期化します。例えば:

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 に答える