Пустой вложенный Бизнесс-объект
Здравствуйте!
Проектирую отчёт, в котором источником данных является конструкция вида:
Класс 2 и 3 в отчёте работают как вложенные Бизнес-объекты и выводятся в дочерние ДатаБэнды (к основному ДатаБэнду идёт привязка Class1, а к дочерним Class1.Classes2 и Class1.Classes3).
Вот только коллекция Класса 2 может быть пустой. И когда она пустая отчёт весь выходит целиком пустым, т.е. даже основной ДатаБэнд не печатается.
Вдобавок если в TextObject сделать в дизайнере привязку [Class1.Classes2.Id], но без указания в DataBand привязки [Class1.Classes2], то вылетает ошибка "Error CS0103: Имя "Class1" отсутствует в текущем контексте".
Попытался избавиться от этого ручным печатаньем таблицы.
Этот метод работал, если Classes2 пустой, но не работал, если Class1 в отчёт передаётся несколько. В rowData.Columns оказываются 2 системные переменные Count и Compare.
Проектирую отчёт, в котором источником данных является конструкция вида:
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.
Комментарии
С ним вариант с дочерним DataBand работает. Но опять только по одиночке.
При загрузке нескольких Class1 (в частности в одном Classes2 не пустой, а во 2-ом пустой), если в TextObject объявить "[Class1.Classes2.Id]", то отчёт выдаёт ошибку. Если данные в TextObject загружать по событию: То он будет генерировать сточки дочернего DataBand без значения Class1.Classes2.Id.