Как я могу установить параметр подотчета? Я успешно подключился к событию SubreportProcessing, я могу найти правильный подотчет через e.ReportPath, и я могу добавлять источники данных через e.DataSources.Add. Но я не нахожу возможности добавить параметры отчета ??
Я нашел людей, предлагающих добавить их в главный отчет, но я действительно не хочу этого делать, поскольку главный отчет вообще не должен быть связан с подчиненным отчетом, кроме того, что он обертывает подотчет.
Я использую один отчет в качестве главного шаблона, печатное название отчета, номера страниц и т. д. И подотчет будет самим отчетом. И если бы я только мог найти способ установить эти параметры отчета во вложенном отчете, я бы хорошо пошел ...
Разъяснение: Создание / определение параметров не проблема. Проблема в том, чтобы установить свои ценности. Я подумал, что естественно сделать это в событии SubreportProcessing. А SubreportProcessingEventArgs действительно имеет свойство Parameters. Но это только чтение! Так как же это использовать? Как я могу установить их значение?
см. мой ответ здесь, возможно, это поможет stackoverflow.com/a/15737703/1148288





Вы можете добавить их через определение 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-определение - это просто «набросок» отчета, не так ли? Нет фактических данных? Я могу определить параметры в редакторе отчетов. Что мне нужно сделать, так это установить их значение.
Вы можете установить значения в XML перед развертыванием отчета. Если вам нужно запрашивать эти значения, я уверен, что вам нужно будет указать их в родительском отчете.
Посмотрев и изучив, я пришел к выводу, что установка параметров подотчета в коде невозможна. Если только вы не сделаете что-то необычное, например, начнете редактировать xml определения отчета перед его загрузкой или что-то в этом роде.
(Но если кто-то еще должен знать, что я ошибаюсь, ответьте, пожалуйста, потому что мне все еще очень любопытно узнать!)
Я попытался использовать DataTable с одной строкой вместо списка параметров, но это не поддерживалось. Или это не понравилось, что в подотчетах были верхние и нижние колонтитулы.
Это действительно работает, но очень привередливо.
Первое, что я рекомендую, - это оформлять свои отчеты в формате .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
Да, это то, что я пришел увидеть, это то, что мне тоже придется делать. Проблема в том, что добавить все эти параметры в основной отчет просто невозможно. Мы используем один основной отчет в качестве шаблона, куда наклеиваем все, что должно быть во всех отчетах. название, параметры, страницы, логотип и т. д.
А затем мы вставляем «настоящий» отчет во вложенный отчет. И это прекрасно работает. За исключением этих параметров. В любом случае, идея заключалась в том, чтобы использовать параметры для перевода, но теперь я создал класс, который исправляет это для меня: codeplex.com/rdlclocalizer
Свиш - Не знаю, с какой стороны водопровода у вас проблемы.
Чтобы добавить параметры в родительский отчет, откройте его, затем щелкните подотчет правой кнопкой мыши и выберите «Свойства»> «Параметры».
Затем вы можете определить имена параметров и присвоить им значение, например
Parameter Name | Parameter Value
---------------+---------------------
MyParameter | =Fields!Params.Value
Таким образом, на этой стороне системы параметры получают свое значение из источника данных родительского отчета.
Чтобы добавить параметры в подотчет, откройте подотчет и на панели инструментов выберите «Отчет»> «Параметры отчета».
Здесь вы определяете параметр для получения параметра из родительского отчета, например
Name | myParameter
----------+---------------------
Data Type | String
Похоже, вы хотите сделать, разве вы не можете отказаться от подотчета и все равно иметь только один отчет? Информация, которую вы пытаетесь обернуть в отчете, идеально подходит для включения в верхние и нижние колонтитулы отчета.
У меня проблемы с тем, что я не могу установить параметры подотчета, а затем установить их с помощью кода, как я могу с источниками данных и определениями отчетов. Я не могу и не хочу избавляться от подотчета, потому что верхняя упаковка содержит больше, чем просто верхний и нижний колонтитулы.
У меня была аналогичная проблема в том, что мне нужно было передать значение 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
}
Затем использовал список этого типа в качестве другого источника данных в основном отчете, а затем в «Свойства подотчета» добавил параметр для каждого параметра в фактическом подотчете и выбрал соответствующие поля из источника данных в качестве их значений.

затем при загрузке отчета преобразуйте входные данные (список сотрудников) в список 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 слишком поздно для установки параметров.
Я пока не вижу хорошего ответа на ваш вопрос. Я поднял вопрос