Rdlc: сообщение о дочернем объекте, который является IList некоторого примитивного типа - PullRequest
1 голос
/ 20 февраля 2009

Я использую отчеты rdlc, чтобы сообщать о некоторых объектах бизнеса. Я использую подотчеты для отчета о вложенных объектах (как описано здесь ).

При использовании обычного списка дочерних объектов, таких как IList (Of Books), я создаю источник данных для книг, а затем использую его как источник данных подотчета.

Я немного застрял, как использовать эту технику, когда вложенный объект представляет собой IList (Of String) или другой список примитивного типа.

Как лучше всего составлять отчеты в этом сценарии?

Ответы [ 2 ]

0 голосов
/ 29 июня 2010

У меня есть такая структура объекта

Заказ -> Список: OrderItems (Продукция) -> Список: Дополнительные товары (Продукция)

У меня есть основной отчет с подотчетом и подотчетом.

Я исправил это следующим образом

В подотчете я передаю параметр в отчет субподряда. этот параметр имеет значение имени продукта и называется «thisproduct».

Функция обработки подотчета вызывается как отчетом подотчета, так и отчетом подподчинения. Поэтому мне нужно назначить источник данных для обоих здесь.

  1. Я назначаю источник данных для подотчета (order.items)

  2. Я добавляю «если», если подотчет (InternalOrderItemAdditionalProducts) вызывает эту функцию. здесь я проверяю параметр и получаю название продукта. Затем я могу просмотреть элементы заказа, найти тот, который относится к рассматриваемому продукту, а затем назначить источник данных подчиненного отчета в качестве дополнительных продуктов, связанных с этим продуктом.

     private void SubreportProcessing(object sender, SubreportProcessingEventArgs e)
      {     
      // assign subreport datasource
      e.DataSources.Add(new ReportDataSource("OrderItems", order.Items));
    
      // if the subsubreport is calling this then
      if (e.ReportPath != null)
          if (e.ReportPath == "InternalOrderItemAdditionalProducts")
          {
              // find the orderitem relating to this product
              foreach (var orderitem in order.Items)
              {
                  if (e.Parameters["thisproduct"].Values[0] == orderitem.ProductType.Name)
                  {
                      // assign the subsubreport datasource to be the additional products of that order item
                      e.DataSources.Add(new ReportDataSource("AdditionalProducts",
                                                             orderitem.Product.AllDescendentAdditionalProducts));
                  }
              }
          }
    

    } ​​

0 голосов
/ 01 июля 2009

Я столкнулся с подобной проблемой. У меня был отчет запуска списка CustomObject. Список CustomObject был заполнен из запроса в списке ParentObjects, который содержал множество ссылок на все их CustomObjects. Отношение было удалено, и вместо него использовался строковый столбец в ParentObject (ParentObject.CustomObjectName). Теперь мой отчет получает строку [], содержащую все имена пользовательских объектов.

Моим решением было создание объекта-оболочки с одним строковым свойством и конструктором для использования в качестве источника данных. Я назвал его так же, как пользовательский объект, который ожидал мой отчет.

class CustomObject 
{ 
   public string Name {get; set;} 

   public CustomObject(string name)
   {
      Name = name;
   }
}

Я загружаю свой список с помощью LINQ, я вызываю конструктор-обертку в операторе select

var wrappedObjects = from parent in GetParentObjects()
   select new CustomObject(parent.CustomObjectName);

Из отчета вы можете добавить источник данных для класса CustomObject, как обычно, и обращаться к объекту как обычно "= Fields! Name.Value".

...