Опять про бизнес объекты
Наткнулся на фичу.
Имеем бизнес обект Class1:
инициализируем его:
в PropertyGrid он выглядит так:
передаем в FastReport:
в окне выбора данных вот что:
свойство CL3List отображается как свойство Class1, а не как свойство СL2!
а если свойство CL2 класса Class1 объявить как
и внести далее соответствующие изменения, то свойство CL3List отображается как надо, т.е. как свойство списка СL2.
так вот вопрос, возможно-ли исправить эту ситуацию, чтоб в обих случаях CL3List отображается как свойство СL2?
Подозреваю, что если Class2 объявить как public class Class2: IEnumerable и реализовать необходимую логику все заработает как надо....
Имеем бизнес обект Class1:
public class Class1
{
public Class1(string name)
{
this.name = name;
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private Class2 cl2;
[TypeConverter(typeof(ExpandableObjectConverter))]
public Class2 CL2
{
get { return cl2; }
set { cl2 = value; }
}
}
public class Class2
{
public Class2(string name)
{
this.name = name;
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private List<Class3> list;
public List<Class3> CL3List
{
get { return list; }
set { list = value; }
}
}
public class Class3
{
public Class3(string name)
{
this.name = name;
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
инициализируем его:
Class1 cl1 = new Class1("Class1");
List<Class3> list = new List<Class3>();
list.Add(new Class3("1 Class 3 "));
list.Add(new Class3("2 Class 3 "));
list.Add(new Class3("3 Class 3 "));
Class2 cl2 = new Class2("Class 2");
cl2.CL3List = list;
cl1.CL2 = cl2;
в PropertyGrid он выглядит так:
передаем в FastReport:
List<Class1> l = new List<Class1>();
l.Add(cl1);
Report report = new Report();
report.RegisterData(l, "Class1", FastReport.Data.BOConverterFlags.BrowsableOnly, 5);
report.Design();
в окне выбора данных вот что:
свойство CL3List отображается как свойство Class1, а не как свойство СL2!
а если свойство CL2 класса Class1 объявить как
private List<Class2> cl2;
public List<Class2>CL2
{
get { return cl2; }
set { cl2 = value; }
}
и внести далее соответствующие изменения, то свойство CL3List отображается как надо, т.е. как свойство списка СL2.
так вот вопрос, возможно-ли исправить эту ситуацию, чтоб в обих случаях CL3List отображается как свойство СL2?
Подозреваю, что если Class2 объявить как public class Class2: IEnumerable и реализовать необходимую логику все заработает как надо....
Комментарии
Вот еще что, если Class2 обявлен как public class Class2<T> where T : new () (вообщем как generic), то в FastReport его тип (DataType) определится как Class2`1
У структуры из 1го поста Class2 - комплексное свойство, чтобы FastReport воспринемал его как источник данных внести изменения:
и добавить класс Class2Enumerator:
в результате получаем:
Раньше ведь другое поведение было ? (в версии 1.064 точно)
Вообщем ситуация следующая
в дата соурсе вижу только одну коллекцию Items
1 в отчете надо получить две таблицы с хидерами для Collection1 и Collection2 как быть ?
правильно ли будет так как предложил Domoch, обязательно ли в этом случае датабенд вешать на свойства Collection1 и Collection2, или он по умолчанию 1-ю запись возмет?
2 что если class Collection2 : CollectionBase <Item2> ? (не проверял)
3 может хотябы имена давать Collection1 - Items
регистрирую коллекцию CompositeReportElement
а как будет алиас строиться?
хотелось бы какой-нибудь разделитель желательно отличный от пробела так как алиас Collection1 может их уже содержать (у меня во всяком случае есть пара таких)
вроде как не очень юзер френдли получается :-(
Что будет нового:
- при регистрации не нужно указывать параметр maxNestingLevel. Уровень вложенности может быть любым - в окне "Выбрать данные" можно развернуть столько уровней, сколько необходимо в данном отчете;
- структура источника данных полностью повторяет структуру бизнес-объекта (Ваш случай - когда вложенный источник данных находится в промежуточном св-ве).
Минусы: существующие отчеты, если в них используются вложенные источники, придется переделать.
с отчетами конечно хуже (около 20шт), хотя они щас в старом формате (Collection1.Items).
Хорошо бы конечно еще и мастер для таких отчетов, т.е. несколько таблиц в одном отчете и к группировке добавить выбор тоталов
пока что System.StackOverflowException на некоторых очетах :-)
пробую найти мин. код для повторения
1 report.RegisterData(IEnumerable, string)
2 в дизайнере ставим галки на дата соурсах
3 сохраняем отчет
4 новый инстанс отчета
5 грузим из сохраненого
6 опять report.RegisterData(IEnumerable, string)
StackOverflow
или
1 report.RegisterData(IEnumerable, string)
2 в дизайнере ставим галки на дата соурсах
3 превью (отчет вообще без полей)
4 закрываем превью
StackOverflow
спасибо, разобрался