0

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

4

1 回答 1

1

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

希望这对您有所帮助。

于 2013-09-11T15:49:41.797 回答