Сброс значения свойств в другом событии - PullRequest
0 голосов
/ 30 ноября 2010

У меня возникли проблемы с корректным форматированием. Я полагаю, что это происходит из-за неправильного понимания событий, в которые я пытаюсь внести изменения.

любое направление было бы замечательно

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

1 Ответ

2 голосов
/ 01 декабря 2010

Вы не можете быть уверены, что событие BeforePrint возникает точно после соответствующего события FetchData. Например, FetchData может запускаться много раз для нескольких записей, но из-за некоторой логики объединения в модуле компоновки может потребоваться несколько записей, прежде чем ActiveReports узнает, на какую страницу он будет фиксировать раздел. Поэтому довольно часто FetchData вызывается для нескольких событий, прежде чем будут вызваны соответствующие события BeforePrint.

Если я правильно понимаю ваш код, то есть большая проблема. Похоже, что вы вычисляете значения в своих подчиненных отчетах (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.
...