Почему привязка к свойству дочернего объекта с помощью отчета rdlc не будет работать в vs2010?


Некоторое время назад кто-то спросил, Как привязать к свойству дочернего объекта в отчете rdlc. Вопрос здесь .

Решение состояло в том, чтобы использовать выражение, подобное этому:

=Fields!ChildObject.Value.SomeProperty

Недавно я попытался обновить до версии 10 библиотеки отчетов (Microsoft.Элемент управления reportviewer.WebForms и Microsoft.Элемент управления reportviewer.Общий) и почему-то это больше не работает. Я получил отчет рендеринга и отображения всех данных отлично, за исключением любого, который использует эту технику. Вместо в качестве значения свойства я получаю текст: "#Error "

Почему это больше не работает? Кто-нибудь знает, как это сделать в новой версии?

3 2

3 ответа:

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

Вы можете найти пример проекта на этом сайте, который показывает рабочую версию: http://wraithnath.blogspot.com/2011/04/reportviewer-object-datasource-nested.html

Автор также упоминает, что вашим классам потребуется конструктор без параметров, но я получил его для работы с классами без конструктора по умолчанию. И все же, если вы отметили все как сериализуемое и все еще видите сообщение "# Error", попробуйте использовать конструкторы без параметров.

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

List<Loan> loans = new List<Loan>();
loans.Add(GetLoanByLoanNumber(loanNumber));

LocalReport report = new LocalReport();
report.ReportPath = HostingEnvironment.MapPath("~/bin/Report/Receipt.rdlc");

ReportDataSource loanDetailsDataSource = new ReportDataSource();
loanDetailsDataSource.Name = "LoanDataSet"; //This refers to the dataset name in the RDLC file
loanDetailsDataSource.Value = loans;
report.DataSources.Add(loanDetailsDataSource);

ReportDataSource loanItemsDataSource = new ReportDataSource();
loanItemsDataSource.Name = "LoanItemsDataSet"; //This refers to the dataset name in the RDLC file  
loanItemsDataSource.Value = loans[0].loanItems;
report.DataSources.Add(loanItemsDataSource);

ReportDataSource principalPaymentDataSource = new ReportDataSource();
principalPaymentDataSource.Name = "PrincipalPaymentDataSet"; //This refers to the dataset name in the RDLC file
principalPaymentDataSource.Value = loans[0].principalPayments;
report.DataSources.Add(principalPaymentDataSource);

ReportDataSource interestPaymentDataSource = new ReportDataSource();
interestPaymentDataSource.Name = "InterestPaymentDataSet"; //This refers to the dataset name in the RDLC file  
interestPaymentDataSource.Value = loans[0].interestPayments;
report.DataSources.Add(interestPaymentDataSource);

Надеюсь, это кому-нибудь поможет !