Вы не можете быть уверены, что событие 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.