2010-11-30 1 views
0

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

любое направление было бы здорово

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

Вы, кажется, не устанавливаете `ShouldShowBottBorder` в любом месте. Не могли бы вы показать нам источник этой собственности? – 2010-11-30 04:01:02

ответ

2

Вы не можете быть уверены, что событие 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 см the Report Events concepts topic in the ActiveReports Online Help. Чтобы узнать больше о передаче данных в Subreports, см. Subreports with Run-Time Data Sources in the ActiveReports Online Help.

Scott Willeke 
GrapeCity inc. 
Смежные вопросы