Пустой вложенный Бизнесс-объект

отредактировано November 2014 Раздел: FastReport .NET
Здравствуйте!
Проектирую отчёт, в котором источником данных является конструкция вида:
Class1
{
public int Id { get; set; }

public ICollection<Class2> Classes2 { get; set; }

public ICollection<Class3> Classes3 { get; set; }
}

Класс 2 и 3 в отчёте работают как вложенные Бизнес-объекты и выводятся в дочерние ДатаБэнды (к основному ДатаБэнду идёт привязка Class1, а к дочерним Class1.Classes2 и Class1.Classes3).
Вот только коллекция Класса 2 может быть пустой. И когда она пустая отчёт весь выходит целиком пустым, т.е. даже основной ДатаБэнд не печатается.
Вдобавок если в TextObject сделать в дизайнере привязку [Class1.Classes2.Id], но без указания в DataBand привязки [Class1.Classes2], то вылетает ошибка "Error CS0103: Имя "Class1" отсутствует в текущем контексте".

Попытался избавиться от этого ручным печатаньем таблицы.
//Я ввёл Get переменную в источник, чтобы знать количество. Больше 1 потому что, если элемент 1, то он выводится только на основной ДатаБэнд.
if (((Int32)Report.GetColumnValue("Class1.Classes2Count")) > 1)
      {
        
        DataSourceBase rowData = Report.GetDataSource("Class1.Classes2");
        
        rowData.Init();
      
        while (rowData.HasMoreRows)
        {
       
          Table1.PrintRow(0);
          Cell1.Text = rowData[rowData.Columns[0]].ToString();
          Table1.PrintColumns();
          rowData.Next();
        }
      }
    }

Этот метод работал, если Classes2 пустой, но не работал, если Class1 в отчёт передаётся несколько. В rowData.Columns оказываются 2 системные переменные Count и Compare.

Комментарии

  • отредактировано 09:36
    Нашёл свойство у DataBand PrintIfDatasourceEmpty.
    С ним вариант с дочерним DataBand работает. Но опять только по одиночке.
    При загрузке нескольких Class1 (в частности в одном Classes2 не пустой, а во 2-ом пустой), если в TextObject объявить "[Class1.Classes2.Id]", то отчёт выдаёт ошибку. Если данные в TextObject загружать по событию:
    private void Text26_AfterData(object sender, EventArgs e)
        {
          if (((Int32)Report.GetColumnValue("Class1.Classes2Count")) > 1)
          {
            ((TextObject)sender).Text = "Id = " + ((String)Report.GetColumnValue("Class1.Classes2.Id"));
          }    
        }
    
    То он будет генерировать сточки дочернего DataBand без значения Class1.Classes2.Id.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.