Добавление программного источника данных / набора данных в LocalReport

Есть ли способ программно добавить источник данных / набор данных в Microsoft.Reporting.WebForms.LocalReport, когда report-XmlFile (*.rdlc) не имеет определений источника данных / набора данных во время разработки?

Это работает, если у меня уже есть определение источника данных / набора данных в моем *.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 перед процессом рендеринга, есть идеи?

Спасибо!

1 ответ

Решение

Вы не можете оставить RDLC без DataSets, если вы используете его и 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);
Другие вопросы по тегам