2013-08-26 64 views
0

我想查找和更改rdlc文件中報告項目元素值的屬性。我反序列化ReportDefinition.xsd與xsd.exe工具:如何從反序列化的rdlc文件更改rdlc報告項目?

using (TextReader textReader = new StreamReader(RdlcPath, Encoding.UTF8)) 
     { 
      var serializer = new XmlSerializer(typeof(SampleRDLSchema.Report)); 
      Report instance = (SampleRDLSchema.Report)serializer.Deserialize(textReader); 
      textReader.Close(); 
     } 

,但現在我怎麼可以得到報表項目元素值的變化(例如改變的Tablix寬度或文本內容)

+2

爲什麼要用XML操作來改變它們?如果您試圖根據基礎數據更改它們,則可以使用公式來設置屬性。這些將創建動態屬性,在報告運行時計算。 –

回答

1

像傑米˚F說,?在報告中使用公式和表達式會更容易。 但是,如果您堅持通過XML操作來完成此操作,請考慮更改xml而不是反序列化的對象。 我說這個的原因是因爲它更乾淨。 對於反序列化的對象,你必須做一個循環,檢查每個對象是否是你想要的節點,然後繼續這個過程,直到找到你想要的節點。

如果對象是序列化的並且是XML格式的字符串,那麼可以簡單地使用XElement快速獲取所需的內容。 例如: 我用它從它的報告定義(文件xml字符串)中獲取報告的寬度。

public String GetWidth() 
{ 
    XElement Report = XElement.Parse(this._ReportDefinition); 
    return Report.Element({http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition}Width").Value; 
} 

或者又如:

// The grabs the names of all tablix report items from the report definition. 
    public String GetReportItemName(String DataSetName) 
    { 
     XElement Report = XElement.Parse(this._ReportDefinition); 

     String ReportItemName = String.Empty; 
     XElement Body = Report.Element("{http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition}Body"); 
     XElement ReportItems = Body.Element("{http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition}ReportItems"); 
     foreach (XElement ReportItem in ReportItems.Elements()) 
     { 
      if (ReportItem.Name == "{http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition}Tablix") 
      { 
       String Name = ReportItem.Element("{http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition}DataSetName").Value; 

       if (Name == DataSetName) 
       { 
        ReportItemName = ReportItem.Attribute("Name").Value; 
       } 
      } 
     } 

     return ReportItemName; 
    } 

希望這是對你有所幫助。