代码之家  ›  专栏  ›  技术社区  ›  Ali Bigdeli

如何从反序列化的rdlc文件中更改rdlc报告项?

  •  0
  • Ali Bigdeli  · 技术社区  · 11 年前

    我想查找并更改rdlc文件中报表项元素值的财产。我使用xsd.exe工具反序列化了ReportDefinition.xsd:

    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宽度或文本框内容)

    1 回复  |  直到 11 年前
        1
  •  1
  •   Shelby115    11 年前

    正如Jamie 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;
        }
    

    希望这对你有帮助。