Domanda

Sto avendo qualche problema con ricevendo il formattazione a verificarsi in modo corretto. Credo che deriva da ciò che è la comprensione probabilmente errata degli eventi che sto tentando di apportare le modifiche in.

ogni direzione sarebbe grande

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

il problema è che ogni volta che passo attraverso il metodo eh_BeforePrint, i valori equivale sempre a false anche se faccio un passo attraverso le relazioni sub ed i valori sono impostati correttamente. Quello che sta accadendo a causare la proprietà bool per ripristinare false?

Proprio cambiarlo se ci sono record da stampare nel metodo Fetch_Data di ogni rapporto di sub.

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

Soluzione

Non si può essere certi che l'evento BeforePrint solleva esattamente dopo il corrispondente evento FetchData. Ad esempio, FetchData può sparare molte volte per diversi record, ma a causa di una certa logica tenere insieme nel motore di layout, potrebbero essere necessari diversi record prima ActiveReports sa quale pagina si commetterà una sezione a. Pertanto, è abbastanza comune per FetchData di essere sollevato per diversi eventi prima dei corrispondenti eventi BeforePrint vengono generati.

Se ho ben capito il codice correttamente c'è un problema più grande però. Sembra che si sta calcolando i valori nei vostri sottoreport (m_causes e m_actions sembrano essere subreports effettivi). Se questo è il caso non si può calcolare in modo affidabile i valori nei vostri sottoreport e passarli fuori alla relazione genitore. Invece, è necessario calcolare questi valori nel rapporto genitore. Tuttavia, di solito è possibile aggiungere qualche funzione condivisa per calcolare il valore e chiamare dal rapporto padre e quindi passare tale valore nei sottoreport.

il commento qui con qualche informazione in più se avete domande specifiche circa farlo.

In una nota indipendenti, è possibile ottenere un incremento delle prestazioni piuttosto significativo se si cambia il modo in cui stai inizializzazione vostri subreports. inizializzare sempre le sottoreport in caso ReportStart e quindi impostare i propri dati in caso format della sezione che contiene il controllo sottoreport. In questo modo si inizializza ogni sottoreport una volta, invece di inizializzazione ogni subureport per ogni record. Ad esempio:

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

Si sarebbe messa a punto quei valori "campi" in FetchData simile a come la vostra inizializzazione dei subreports ora. Qualcosa di simile a quanto segue:

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

Per saperne di più sugli eventi in ActiveReports vedere il Rapporto argomento Eventi concetti nel ActiveReports Guida in linea . Per ulteriori informazioni su passaggio di dati in sottoreport vedere Sottoreport con Run-Time Data Sources in il Guida ActiveReports in linea.

Scott Willeke
GrapeCity inc.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top