1

当报表 XmlFile (*.rdlc) 在设计时没有数据源/数据集定义时,有没有办法以编程方式将数据源/数据集添加到 Microsoft.Reporting.WebForms.LocalReport?

如果我的 *.rdlc 中已经有数据源/数据集定义,则此方法有效

C#

public byte[] RenderReport(string reportName, string reportFormat)
{
    LocalReport report = LoadReport(reportName);

    //Has same name like DataSet in *.rdlc
    ReportDataSource rds = new ReportDataSource("DataSet1", getData());

    report.DataSources.Clear();
    report.DataSources.Add(rds);

    return report.Render(reportName);
}

private DataTable getData()
{
    DataTable dt = new DataTable();

    dt.Columns.Add(new DataColumn("ID",typeof(System.String)));
    dt.Columns.Add(new DataColumn("NAME", typeof(System.String)));

    dt.Rows.Add(new string[] { "1", "Me" });
    return dt;
}

* .rdlc

  <DataSources>
    <DataSource Name="DataSource1">
      <ConnectionProperties>
        <DataProvider>System.Data.DataSet</DataProvider>
        <ConnectString>/* Local Connection */</ConnectString>
      </ConnectionProperties>
    </DataSource>
  </DataSources>
  <DataSets>
    <DataSet Name="DataSet1">
      <Query>
        <DataSourceName>DataSource1</DataSourceName>
        <CommandText>/* Local Query */</CommandText>
      </Query>
      <Fields>
        <Field Name="ID">
          <DataField>ID</DataField>
          <rd:TypeName>System.String</rd:TypeName>
        </Field>
        <Field Name="NAME">
          <DataField>NAME</DataField>
          <rd:TypeName>System.String</rd:TypeName>
        </Field>
      </Fields>
    </DataSet>
  </DataSets>

但是,如果我删除数据源/数据集定义,我会得到

{Microsoft.Reporting.DefinitionInvalidException:报告''的定义无效。---> Microsoft.ReportingServices.ReportProcessing.ReportPublishingException:文本框“Textbox1”的值表达式引用字段“ID”。报表项表达式只能引用当前数据集范围内的字段,或者如果在聚合内,则只能引用指定的数据集范围。字段名称中的字母必须使用正确的大小写。}

我是否总是必须创建类似“Dummy”-DataSource/DataSet 的东西,还是我的代码中遗漏了一些东西?我希望在渲染过程之前有另一种解决方案来操作 XML,有什么想法吗?

谢谢!

4

1 回答 1

0

如果您正在使用 RDLC 并且 RDLC 嵌入在您的项目中,那么您不能离开没有数据集的 RDLC。要么您将 DataSet 固定并仅更改它的项目要么尝试从 XML 加载报告定义

// Valid XML with dynamic DataSources and DataSets
string s = @"<?xml version=""1.0"" encoding=""utf-8""?><Report ...>...</Report>";
report.LoadReportDefinition(new MemoryStream(Encoding.UTF8.GetBytes(s)));
return report.Render(reportName);
于 2013-07-17T11:23:04.017 回答