Microsoft Reporting: настройка параметров вложенного отчета в коде

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

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

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

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


person Svish    schedule 19.01.2009    source источник
comment
Я пока не вижу хорошего ответа на ваш вопрос. я уточнял вопрос   -  person Sentient    schedule 13.10.2011
comment
см. мой ответ здесь, возможно, это поможет stackoverflow.com/a/15737703/1148288   -  person Lazy Coder    schedule 01.04.2013


Ответы (7)


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

Первое, что я рекомендую, это разрабатывать ваши отчеты как .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
person Community    schedule 25.01.2009
comment
Да, это то, что я пришел, чтобы увидеть то, что я должен был бы сделать также. Проблема в том, что добавить все эти параметры в основной отчет просто невозможно. В качестве шаблона используем один основной отчет, куда клеим все, что должно быть по всем отчетам. название, параметры, страницы, логотип и т.д. - person Svish; 27.01.2009
comment
А затем мы вставляем настоящий отчет внутрь подотчета. И это прекрасно работает. Кроме этих параметров. В любом случае, идея заключалась в том, чтобы использовать параметры для перевода вещей, но теперь я создал класс, который исправляет это для меня: codeplex.com/rdlclocalizer - person Svish; 27.01.2009

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

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

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

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

добавление параметров вложенного отчета

затем при загрузке отчета преобразуйте ввод (список сотрудников) в список 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();
}

А также...

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

person VahidNaderi    schedule 25.05.2013

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

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

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

Вот очень хороший напишите, что объясняет гораздо более ясно.

person NCFireNerd    schedule 01.04.2016
comment
не работает. SubReportProcessing слишком поздно для установки параметров. - person Dave Cousineau; 05.08.2017

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

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

var rp = new ReportParameter("MainReportParamName", Properties.Settings....);
rv.LocalReport.SetParameters(new ReportParameters[] { rp });
person Dr. A    schedule 17.05.2010

Вы можете добавить их через определение 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.

person Dustin Brooks    schedule 20.01.2009
comment
как это помогает? определение xml — это всего лишь набросок отчета, не так ли? Нет реальных данных? Я могу определить параметры в редакторе отчетов. Что мне нужно сделать, так это установить их значение. - person Svish; 20.01.2009
comment
Вы можете установить значения в XML перед развертыванием отчета. Однако, если вам нужно запрашивать эти значения, я уверен, что они должны быть в родительском отчете. - person Dustin Brooks; 20.01.2009

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

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

person Svish    schedule 22.01.2009
comment
Я попытался использовать DataTable с одной строкой вместо списка параметров, но это не поддерживается. Это, или ему не понравилось, что у подотчетов были верхние и нижние колонтитулы. - person Patrick; 28.03.2012

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

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

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

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

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

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

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

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

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

person Community    schedule 11.03.2009
comment
У меня проблемы с тем, что я не могу установить параметры вложенного отчета, а затем установить их с помощью кода, как я могу с источниками данных и определениями отчета. Я не могу и не хочу избавляться от подотчета, потому что верхняя обертка содержит больше, чем просто верхний и нижний колонтитулы. - person Svish; 11.03.2009