Почему не работает привязка к свойству дочернего объекта с отчетом 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", попробуйте его с конструкторами без параметров.
Смотрите вопрос: дочерние объекты в rdlc (Studio 2010RC)
И связанный отчет об ошибке по адресу: https://connect.microsoft.com/VisualStudio/feedback/details/553592/accessing-nested-objects-in-data-source-of-local-report-does-not-function
Нашел еще одну ссылку по этому поводу: http://social.msdn.microsoft.com/Forums/en-US/vsreportcontrols/thread/16bdd594-7056-4796-8d83-39910dab1651
Вам действительно не нужно выравнивать ваши объекты. Вместо этого вы можете связать несколько наборов данных для отчета. Затем вы можете назначить несколько источников данных отчета для вашего отчета с помощью кода. Вот рабочий образец:
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);
Надеюсь, это поможет кому-то!