Microsoft Reporting: настройка параметров подотчета в коде - PullRequest
10 голосов
/ 19 января 2009

Как настроить параметр подотчета? Я успешно подключился к событию SubreportProcessing, могу найти правильный подотчет через e.ReportPath и могу добавить источники данных через e.DataSources.Add. Но я не вижу способа добавить параметры отчета ??

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

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

Пояснение: Создание / определение параметров не является проблемой. Проблема состоит в том, чтобы установить их значения. Я думал, что естественным было сделать это в событии SubreportProcessing. И SubreportProcessingEventArgs действительно имеют свойство Parameters. Но это только для чтения! Так как вы это используете? Как я могу установить их значение?

Ответы [ 7 ]

2 голосов
/ 25 мая 2013

Недавно у меня возникла та же проблема, и во время всех поисков я не нашел ничего полезного, но, наконец, я нашел решение для этого.

Я создал класс, имеющий все параметры в подотчете в качестве его свойств (мы можем назвать его DTO)

public class MyDto
{
    public string EmployeeFirstName{get; set;}
    public string EmployeeLastName{get; set;}
    // and so on
}

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

adding Subreport parameters

затем при загрузке отчета преобразуйте входные данные (список сотрудников) в список MyDto и установите его в качестве источника данных отчетов:

private void LoadReport(List<Employee> employees)
{
    reportviewerMain.ProcessingMode = ProcessingMode.Local;
    reportviewerMain.LocalReport.ReportPath = Application.StartupPath + "\\Reports\\PayChecksReport.rdlc";

    List<MyDto> employeesDataSource = employees.ConvertAll<MyDto>(emp => new MyDto { EmployeeFirstName = emp.FirstName, EmployeeLastName = emp.LastName}).ToList();
    reportviewerMain.LocalReport.DataSources.Add(new ReportDataSource("EmployeesDataSet", employeesDataSource));

    Organization myOrganization = new OranizationFacade().GetOrganizationInfo();
    reportviewerMain.LocalReport.SetParameters(new ReportParameter("OrganizationName", myOrganization.Name));

    this.reportviewerMain.RefreshReport();
}

И ...

Это помогло мне :) Надеюсь, это кому-нибудь поможет.

2 голосов
/ 25 января 2009

Это работает, но это точно привередливый.

Первое, что я рекомендую, - это разработать ваши отчеты как .rdl. Гораздо проще проверить отчеты таким образом. Можно также настроить параметры подотчета и проверить их как rdl, убедившись, что каждый параметр подотчета также определен как параметр родительского отчета. Как только вы получите отчеты, включая подотчеты, работающие таким образом, вы можете переименовать .rdl в rdlc и добавить файлы rdlc в ваш проект ReportViewer. Никаких дальнейших изменений не требуется. Используйте имена источников данных rdl в качестве имен источников данных в своем коде для предоставления данных для отчета в обработчике событий SubreportProcessing.

Вы не присваиваете значения переданному параметру. Подотчет будет использовать их как есть. (Похоже, что пропущенный шаг - это добавление параметров в родительский отчет, а также вложенный отчет, как упомянуто выше.) Вы можете оценить параметры и использовать их в качестве параметров запроса для получения источника данных, который вы добавите. Вы должны подумать о источнике данных, например о нераскрытом измерении для подотчета. Вам придется покопаться во время отладки в обработчике событий, чтобы понять, что я имею в виду. Некоторые из значений в вашем приложении будут легко доступны, другие, которые вы легко используете в другом месте, будут выбрасывать объект не найденные исключения. Например, я создаю набор данных в экземпляре класса, созданного в главной форме моих приложений. Я использую набор данных во всем приложении. В обработчике событий SubreportProcessing я не могу использовать общий набор данных, поэтому я должен создать новый экземпляр таблицы, который мне нужен для отчета, и заполнить его. В основном отчете я смогу получить доступ к общему набору данных. Есть и другие ограничения, как это. Просто пробирайся.

Вот обработчик события SubreportProcessing из работающего приложения VB.NET ReportViewer. Показаны несколько разных способов получения источника данных для подотчета. subreport1 создает одну строку данных из бизнес-объектов приложения, subreport2 предоставляет данные, которые требуются отчету без параметра, subreport3 является лежащим subreport2, но оценивает один из параметров, переданных в подотчет, для использования в значении даты, требуемом запросом, который создает ReportDataSource.

    Public Sub SubreportProcessingEventHandler(ByVal sender As Object, _
                                               ByVal e As SubreportProcessingEventArgs)
    Select Case e.ReportPath
        Case "subreport1"
            Dim tbl As DataTable = New DataTable("TableName")
            Dim Status As DataColumn = New DataColumn
            Status.DataType = System.Type.GetType("System.String")
            Status.ColumnName = "Status"
            tbl.Columns.Add(Status)
            Dim Account As DataColumn = New DataColumn
            Account.DataType = System.Type.GetType("System.String")
            Account.ColumnName = "Account"
            tbl.Columns.Add(Account)
            Dim rw As DataRow = tbl.NewRow()
            rw("Status") = core.GetStatus
            rw("Account") = core.Account
            tbl.Rows.Add(rw)
            e.DataSources.Add(New ReportDataSource("ReportDatasourceName", tbl))
        Case "subreport2"
            core.DAL.cnStr = My.Settings.cnStr
            core.DAL.LoadSchedule()
            e.DataSources.Add(New ReportDataSource("ScheduledTasks", _
                                                   My.Forms.Mother.DAL.dsSQLCfg.tSchedule))
        Case "subreport3"
            core.DAL.cnStr = My.Settings.cnStr
            Dim dt As DataTable = core.DAL.GetNodesForDateRange(DateAdd("d", _
                                                                          -1 * CInt(e.Parameters("NumberOfDays").Values(0)), _
                                                                          Today), _
                                                                  Now)
            e.DataSources.Add(New ReportDataSource("Summary", dt))
    End Select
End Sub
1 голос
/ 02 апреля 2016

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

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

Таким образом, если вы настроили параметры вложенного отчета в основном отчете с такими же именованными параметрами, привязанными к полям основного отчета, значения будут доступны по мере отображения вложенного отчета.

Здесь - это очень хорошее описание, которое объясняет гораздо яснее.

1 голос
/ 17 мая 2010

У меня была похожая проблема: мне нужно было передать значение Properties.Settings ...., чтобы добавить путь к базе данных. Для этого мне нужно было установить свойство в основном отчете и использовать это свойство для установки второго свойства в подотчете. Установка основного свойства, в свою очередь, устанавливает свойство подотчета. ВЫ МОЖЕТЕ установить основное свойство в коде следующим образом:

Предположим, у вас есть имя ReportViewer rv, тогда мы наберем код:

var rp = new ReportParameter("MainReportParamName", Properties.Settings....);
rv.LocalReport.SetParameters(new ReportParameters[] { rp });
0 голосов
/ 11 марта 2009

Свиш - я не уверен, с какой стороны водопровода у вас проблемы.

Чтобы добавить параметры в родительский отчет, откройте его, затем щелкните правой кнопкой мыши вложенный отчет и выберите «Свойства»> «Параметры».

Затем вы можете определить имена параметров и присвоить им значение, например,

Parameter Name | Parameter Value
---------------+---------------------
MyParameter    | =Fields!Params.Value

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

Чтобы добавить параметры во вложенный отчет, откройте вложенный отчет и на панели инструментов выберите «Отчет»> «Параметры отчета»

Здесь вы определяете параметр для получения параметра из родительского отчета, например,

Name      | myParameter
----------+---------------------
Data Type | String

Для того, что кажется, что вы хотите сделать, вы не можете покончить с подотчетом и просто иметь один отчет в любом случае? Информация, которую вы пытаетесь обернуть вокруг отчета, идеально подходит для включения в верхние и нижние колонтитулы отчета.

0 голосов
/ 22 января 2009

Посмотрев и посмотрев, я пришел к выводу, что установка параметров подотчета в коде невозможна. Если вы не сделаете что-то необычное, например, начните редактировать xml определения отчета перед его загрузкой или что-то в этом роде.

(Но если кто-то еще должен знать, что я неправ, пожалуйста, ответьте, потому что мне все еще очень интересно знать!)

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

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

Редактировать: вы можете установить значения в подотчете в XML перед развертыванием отчета. Это не очень гибко, и я предполагаю, что если вы хотите запросить эти значения, вам, скорее всего, они понадобятся в родительском отчете.

Если вы хотите увидеть, как выглядит XML, добавьте вложенный отчет, введите значения для него в свойствах вложенного отчета> параметры, а затем выполните код представления.

<Subreport Name="subreport1">
    <Parameters>
      <Parameter Name="StartDate">
        <Value>=Parameters!StartDate.Value</Value>
      </Parameter>
      <Parameter Name="EndDate">
        <Value>1/1/2009</Value>
      </Parameter>

Вместо использования = Parameters! StartDate.Value Я предполагаю, что вы захотите поместить фактическое значение, как в EndDate.

...