Pregunta

Estoy teniendo algunos problemas con conseguir el formato que se produzca correctamente. Creo que se debe a la comprensión de lo que es probablemente incorrecta de los hechos que estoy tratando de hacer los cambios en.

cualquier dirección sería 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;
        }
    }

el problema es que cada vez que paso a través del método eh_BeforePrint, los valores siempre equivale a falso a pesar de que el paso a través de los informes de sub y los valores están ajustados correctamente. Lo que está sucediendo para hacer que la propiedad bool para restablecer falsa?

Sólo cambiarlo si hay registros para imprimir en el método Fetch_Data de cada sub informe.

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

Solución

No se puede estar seguro de que el evento BeforePrint plantea exactamente después del evento FetchData correspondiente. Por ejemplo, FetchData puede disparar muchas veces por varios registros, pero debido a cierta lógica Mantener juntos en el motor de renderizado, puede tardar varios registros antes ActiveReports sabe qué página va a cometer un apartado a. Por lo tanto, es bastante común para FetchData a ser elevado por varios eventos antes de que se plantearon los eventos BeforePrint correspondientes.

Si entiendo correctamente su código no es un problema más grande sin embargo. Al parecer, se está calculando los valores en sus informes integrados (m_causes y m_actions parecen ser subinformes reales). Si ese es el caso, no se puede calcular de forma fiable los valores en sus informes integrados, y pasarlas al informe de los padres. En su lugar, tendrá que calcular esos valores en su informe de los padres. Sin embargo, por lo general se puede añadir un poco de función compartida para calcular el valor y llamarlo desde el informe de los padres, y luego pasar ese valor en los informes integrados.

comentario aquí con algo más de información si tiene preguntas específicas acerca de hacer eso.

En una nota relacionada, se puede obtener un impulso muy significativa del rendimiento si cambia la forma en que está inicializando sus informes integrados. Siempre inicializar sus informes integrados en caso ReportStart y establezca sus datos en caso de formato de la sección que contiene el control de subinforme. De esta manera se inicializa cada vez subinforme en lugar de inicializar cada subureport para cada registro. Por ejemplo:

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

haría configuración esos valores "campos" en FetchData similares a cómo su inicialización de los informes integrados ahora. Algo parecido a lo siguiente:

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

Para obtener más información sobre los eventos en ActiveReports ver el Informe de Eventos conceptos tema en el ActiveReports Ayuda en línea . Para obtener más información acerca de pasar datos en Subinformes ver Subinformes con tiempo de ejecución Fuentes de datos en la Ayuda ActiveReports en línea.

Scott Willeke
GrapeCity inc.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top