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

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

Это работает, если у меня уже есть определение источника/набора данных в моем *.rdlc

С#

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: выражение Value для текстового поля «Textbox1» относится к полю «ID». Выражения элементов отчета могут ссылаться только на поля в пределах текущей области набора данных или, если они находятся внутри агрегата, в указанной области набора данных. Буквы в именах полей должны быть в правильном регистре.}

Мне всегда нужно создавать что-то вроде "Dummy"-DataSource/DataSet или я что-то упускаю в своем коде? Я надеюсь, что есть другое решение, как манипулировать XML перед процессом рендеринга, есть идеи?

Спасибо!


person smunar    schedule 12.07.2013    source источник


Ответы (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);
person Aleksej Vasinov    schedule 17.07.2013
comment
report.Render принимает в качестве параметра «формат строки», а не имя отчета. - person narayan; 05.01.2015