Question

Je suis un peu de difficulté à obtenir la mise en forme de se produire correctement. Je crois qu'il découle de ce qui est probablement une mauvaise compréhension des événements que je tente de faire les changements dans.

ne importe quelle direction serait grand

    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;
        }
    }

la question est que chaque fois que l'étape I par la méthode eh_BeforePrint, les valeurs assimilent toujours à faux pas, même si je dans les rapports sous et les valeurs sont correctement réglé. Ce qui se passe pour causer la propriété bool pour réinitialiser false?

Il suffit de le changer s'il y a des enregistrements à imprimer dans la méthode Fetch_Data de chaque sous-rapport.

    private void Causes_FetchData(object sender, FetchEventArgs eArgs)
    {
        if (m_pos < m_corrs.Count)
        {
            if (!ShouldShowBottBorder)
                ShouldShowBottBorder = true;
            //...
         } 
     }
Était-ce utile?

La solution

Vous ne pouvez pas être assuré que l'événement BeforePrint soulève exactement après l'événement fetchData correspondant. Par exemple, fetchData peut tirer plusieurs fois pour plusieurs dossiers, mais en raison d'une logique ensemble de garder dans le moteur de mise en page, il peut prendre plusieurs enregistrements avant ActiveReports sait quelle page il commettra une section. Par conséquent, il est assez commun pour fetchData à soulever plusieurs événements avant sont élevés les événements BeforePrint correspondants.

Si je comprends bien votre code il y a un problème plus grand bien. Il semble que vous calculez valeurs dans vos sous-rapports (m_causes et m_actions semblent être des sous-rapports réels). Si tel est le cas, vous ne pouvez pas calculer de manière fiable les valeurs dans vos sous-rapports et les transmettre au rapport parent. , Vous aurez besoin au lieu de calculer ces valeurs dans votre rapport de parent. Cependant, vous pouvez généralement ajouter une fonction partagée pour calculer la valeur et l'appeler du rapport parent, et ensuite passer cette valeur dans les sous-rapports.

commentaires ici avec un peu plus d'informations si vous avez des questions au sujet de le faire.

Sur une note sans rapport, vous pouvez obtenir un gain de performances assez important si vous changez la façon dont vous l'initialisation de votre sous-rapports. Toujours initialiser votre subreports en cas de ReportStart puis définissez leurs données en cas de format de la section contenant le contrôle Subreport. De cette façon, vous initialisez chaque fois au lieu de sous-état initialiser chaque subureport pour chaque enregistrement. Par exemple:

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);
}

Vous feriez configurer ces « champs » valeurs fetchData similaires à la façon dont votre initialisant les sous-rapports maintenant. Quelque chose comme ce qui suit:

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;
    }
}

Pour en savoir plus sur les événements de ActiveReports voir la rubrique concepts Rapport d'événements dans le ActiveReports Aide en ligne . Pour en savoir plus sur les données passant dans Subreports voir Subreports avec Run-Time sources de données dans le ActiveReports Aide en ligne .

Scott Willeke
GrapeCity inc.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top