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

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

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

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

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

Я пока не вижу хорошего ответа на ваш вопрос. Я поднял вопрос

Sentient 13.10.2011 02:54

см. мой ответ здесь, возможно, это поможет stackoverflow.com/a/15737703/1148288

Lazy Coder 01.04.2013 08:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
2
26 910
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

как это помогает? XML-определение - это просто «набросок» отчета, не так ли? Нет фактических данных? Я могу определить параметры в редакторе отчетов. Что мне нужно сделать, так это установить их значение.

Svish 20.01.2009 10:52

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

Dustin Brooks 20.01.2009 17:05
Ответ принят как подходящий

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

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

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

Patrick 28.03.2012 19:03

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

Первое, что я рекомендую, - это оформлять свои отчеты в формате .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

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

Svish 27.01.2009 00:19

А затем мы вставляем «настоящий» отчет во вложенный отчет. И это прекрасно работает. За исключением этих параметров. В любом случае, идея заключалась в том, чтобы использовать параметры для перевода, но теперь я создал класс, который исправляет это для меня: codeplex.com/rdlclocalizer

Svish 27.01.2009 00:22

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

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

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

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

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

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

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

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

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

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

Svish 11.03.2009 20:54

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

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

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

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

Я создал класс, имеющий все параметры в подотчете в качестве свойств (мы можем назвать его 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();
}

А также...

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

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

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

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

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

не работает. SubReportProcessing слишком поздно для установки параметров.

Dave Cousineau 05.08.2017 06:36

Другие вопросы по теме