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

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

Решением было использовать такое выражение:

=Fields!ChildObject.Value.SomeProperty

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

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

3 ответа

Решение

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

Вы можете найти образец проекта на этом сайте, который показывает рабочую версию: 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);

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

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