Необходимо получить кадр параметров в отчете RDLC - PullRequest
1 голос
/ 06 декабря 2010

Я создаю приложение Winforms (.NET).

Предположим, у меня есть 10 отчетов RDLC с различными параметрами. Нужно ли создавать 10 экранов (форм), чтобы получить параметры для соответствующих отчетов, чтобы я мог выполнить базовый метод заполнения DataSet.

Существует ли какой-либо (бесплатный) инструмент, облегчающий эту работу.

Или я что-то упустил, это уже там?

Подводя итог ... Я планирую иметь одну форму с контролем просмотра отчетов, которая может использоваться для отображения различных отчетов, и она может позаботиться о сборе параметров и выполнении отчетов. Так что все, что мне нужно, это передать форму только с именем отчета.

Примечание: я знаю, что серверный отчет (RDL) мог бы сделать это, но у меня нет сервера отчетов для этого проекта.

Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 20 января 2011

За комментарий из моего другого ответа я не знаю ни одного такого инструмента, так как во многих отчетах могут быть такие разные критерии, и таблицы / столбцы, которые они запрашивают, могут оказаться непрактичными.Я сделал это на другом языке, где у меня были бы общие элементы управления для таких вещей, как выбор диапазона дат (от / до), и чтобы он генерировал и возвращал эту часть моего предложения WHERE.Точно так же, как сортировка, со списком, построенным с отображаемым значением, но внутренним значением ключа будет представлять заказ по предложению в предложении где.Тогда наличие общего пользовательского контейнера управления с этими элементами поможет стандартизировать, как пользовательский интерфейс сможет их выбирать (и, возможно, другие, которые являются общими).Затем примените к классу общий виртуальный метод, такой как «GetMyData ()», элемент управления можно разделить на подклассы для любого количества экземпляров / отчетов, сколько вам нужно, каждый из которых знает, как обрабатывать запрашивающие компоненты, представленные пользователю, ифактически получить репрезентативные данные для окончательного вывода.

0 голосов
/ 19 января 2011

Я на самом деле сделал это в приложении.Тем не менее, вместо того, чтобы беспокоиться о том, какие параметры передавать, и супер перегрузить объект Constructor моего класса отчетности.У него просто есть экземпляр «ReportViewer» в качестве объекта, с которым я работаю.

public partial class MyReport : Form
{
   protected ReportViewer reportViewer = new ReportViewer();

   public MyReport()
   { InitializeComponent(); }

Затем я предоставлю несколько открытых методов, по одному для каждого отчета, для которых требуются различные параметры, если это необходимо,но если в общем случае передается набор данных с одной или несколькими таблицами в нем для отчета.Затем я буду динамически циклически перебирать таблицы и добавляю к элементу управления просмотра отчетов

   public Boolean GenerateCommonReport( DataSet oDS, 
           String NameOfReport, String[] SubReports)
   {
      // Set Processing Mode.
      reportViewer.ProcessingMode = ProcessingMode.Local;

      reportViewer.LocalReport.LoadReportDefinition(GetRDLC( NameOfReport ));

      // I've actually an extended version that includes subreports with an array
      // of separate .RDLC file names in case the report is nested... if so, those
      // would need to be added too.
      if( ! (SubReports == null ))
      {
         // the hitch here, is that in my case, any sub-reports are named by the same
         // name as the .RDLC in the report just in case thee's any object renaming 
         // when you add one sub-report into the main report.  Such as when adding 
         // textboxes, it will create textbox1, textbox2, textbox3, etc...  So, you
         // may have to wiggle with this some to match the actual name of the sub-report
         // object in your main report.
         foreach( String ar in SubReports )
            reportViewer.LocalReport.LoadSubreportDefinition( ar, GetRDLC( ar ));
      }

      // Next load the dataset into the report before finally showing.
      foreach (DataTable oTbl in oDS.Tables)
         // likewise with the datasets.  If you look at your RDLC of the schema's
         // used, it will reference an outer Dataset name, then force an "_" before
         // the actual table it uses WITHIN that dataset.  Don't worry, internally 
         // it splits it up and finds correct correlation.
         reportViewer.LocalReport.DataSources.Add(
                new ReportDataSource(oDS.DataSetName + "_" + oTbl.TableName, oTbl));


      // Finally, add the report viewer control to your displaying form control
      reportViewer.Dock = DockStyle.Fill;
      this.Controls.Add(reportViewer);

      reportViewer.SetDisplayMode(DisplayMode.PrintLayout);
      reportViewer.RefreshReport();

      // This is actually showing your form as a modal dialog window to the user
      this.ShowDialog();
  }


  // get embedded reports directly from this DLL/project
  private Stream GetRDLC(String RptRDLC)
  {
     // Ex: we want the report "FirstReport" within the "MyReports.dll" 
     // assembly "MyReports.FirstReport.rdlc"
     Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(
    "MyReports." + RptRDLC + ".rdlc" );
     return stream;
  }

}

Теперь, чтобы фактически ВЫЗВАТЬ это и собрать все вместе ...

DataSet oDS = YourObject.HoweverYouQueryToGetADataset();
MyReport oRpt = new MyReport();
oRpt.GenerateCommonReport( oDS, "MyFirstReport", null );

Я лишил кучу других проверочных попыток / уловок и т. Д. И удалил ссылки на конкретные объекты из моего фактического кода, но шаблон ниже должен дать вам потрясающий старт.

...