2010-11-30 24 views
0

Je n'arrive pas à obtenir correctement le formatage. Je crois qu'il découle de ce qui est la compréhension probablement erronée des événements que je tente de faire les changements dans.Réinitialisation de la valeur des propriétés dans un autre événement

ne importe quelle direction serait grand

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

le problème est que chaque fois que je fais un pas dans la eh_BeforePrint méthode, les valeurs sont toujours égales à false même si je parcours les sous-rapports et que les valeurs sont correctement définies. Que se passe-t-il pour réinitialiser la propriété bool à false? Il suffit de le changer s'il y a des enregistrements à imprimer dans la méthode Fetch_Data de chaque sous-rapport.

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

Vous ne semblez pas définir 'ShouldShowBottBorder' n'importe où. Pourriez-vous nous montrer la source de cette propriété? –

Répondre

2

Vous ne pouvez pas être sûr que l'événement BeforePrint déclenche exactement après l'événement FetchData correspondant. Par exemple, FetchData peut se déclencher plusieurs fois pour plusieurs enregistrements, mais en raison de la logique qui reste dans le moteur de rendu, plusieurs enregistrements peuvent être nécessaires avant qu'ActiveReports ne sache à quelle page il va commettre une section. Par conséquent, il est assez courant que FetchData soit levé pour plusieurs événements avant que les événements BeforePrint correspondants ne soient déclenchés.

Si je comprends bien votre code, il y a un plus gros problème. Il semble que vous calculiez des valeurs dans vos sous-rapports (m_causes et m_actions semblent être des sous-rapports réels). Si tel est le cas, vous ne pouvez pas calculer de manière fiable les valeurs dans vos sous-rapports et les transmettre au rapport parent. Au lieu de cela, vous devrez calculer ces valeurs dans votre rapport parent. Toutefois, vous pouvez généralement ajouter une fonction partagée pour calculer la valeur et l'appeler à partir du rapport parent, puis transmettre cette valeur dans les sous-états.

Commentez ici avec plus d'informations si vous avez des questions spécifiques à ce sujet.

Sur une note non liée, vous pouvez obtenir une augmentation significative des performances si vous modifiez la façon dont vous initialisez vos sous-rapports. Toujours initialiser vos sous-rapports dans l'événement ReportStart, puis définissez leurs données dans l'événement de format de la section contenant le contrôle Subreport. De cette façon, vous initialisez chaque sous-rapport une fois au lieu d'initialiser chaque sous-port pour chaque enregistrement. Par exemple:

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

Vous feriez configuration similaire à la façon dont ces valeurs « champs » dans votre fetchData initialisant les sous-rapports maintenant. Quelque chose comme ce qui suit:

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

Pour en savoir plus sur les événements ActiveReports voir the Report Events concepts topic in the ActiveReports Online Help. Pour en savoir plus sur la transmission de données dans les sous-rapports, voir Subreports with Run-Time Data Sources in the ActiveReports Online Help.

Scott Willeke 
GrapeCity inc.