Почему привязка к свойству дочернего объекта с помощью отчета rdlc не будет работать в vs2010?
Некоторое время назад кто-то спросил, Как привязать к свойству дочернего объекта в отчете rdlc. Вопрос здесь .
Решение состояло в том, чтобы использовать выражение, подобное этому:
=Fields!ChildObject.Value.SomeProperty
Недавно я попытался обновить до версии 10 библиотеки отчетов (Microsoft.Элемент управления reportviewer.WebForms и Microsoft.Элемент управления reportviewer.Общий) и почему-то это больше не работает. Я получил отчет рендеринга и отображения всех данных отлично, за исключением любого, который использует эту технику. Вместо в качестве значения свойства я получаю текст: "#Error "
Почему это больше не работает? Кто-нибудь знает, как это сделать в новой версии?
3 ответа:
Я могу подтвердить, что эта ошибка была исправлена в VS2010 SP1 ... но вы должны отметить Все соответствующих классов как сериализуемые.
Вы можете найти пример проекта на этом сайте, который показывает рабочую версию: 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);
Надеюсь, это кому-нибудь поможет !