Businessobjectdatasource

отредактировано 06:38 Раздел: FastReport .NET
1 неправильно выводится тип данных для Nullable типов (например для поля DateTime? в сойствах тип Nullable'1)
2 для вложенных коллекций List<T> помимо таблицы появляется поле с тем же названием но типом List'1

Комментарии

  • отредактировано 06:38
    1) попробуем исправить;
    2) это необходимо для правильной работы. Это поле имеет Enabled = false и в дереве данных не отображается.
  • отредактировано 06:38
    Что-то несовсем понятно что присходит с бизнес объектами:
    //Класс бизнес объекта
    public class Human
        {
            public string Name; 
            public int Age;
            public List<Human> parents;
    
            public Human(string name, int age)
            {
                Name = name;
                Age = age;
                parents = new List<Human>();
            }
        }
    
    //Сборка данных и передача в отчет
    ...
    List<Human> peoples = new List<Human>();
    Human h = new Human("Human1", 123);
    Human fH = new Human("pHuman1", 158);
    Human mH = new Human("pHuman2", 158);
    h.parents.Add(fH);
    h.parents.Add(mH);
    peoples.Add(h);
    Report report = new Report();
    
    report.RegisterData(peoples, "Peoples", FastReport.Data.BOConverterFlags.AllowFields, 5);
    report.Design();
    
    в дизайнере поле parents данных не содержит вообще никаких... Так и должно быть? И почему так происходит?
  • отредактировано 06:38
    FastReport не обрабатывает ссылки на самого себя, иначе будет зацикливание.
  • отредактировано 06:38
    Хм... параметр maxNestingLevel может выступать в роли защиты от зациклавания. Сколько разработчик указал уровней вложенности объектов, на столько и копать, даже если есть цикл.
  • отредактировано 06:38
    Идея хорошая, подумаю над реализацией.
  • отредактировано 06:38
    Заранее спасибо. :)
  • отредактировано 06:38
    Добавил, очередная версия соберется ночью.
  • отредактировано 06:38
    Отлично работает, но есть одна особенность:
    Есть объект
    public class Human
        {
            public string Name; 
            public Human parent;
           
            public Human(string name, int age)
            {
                Name = name;
            }
        }
    
    создаем экземпляры
    Human h = new Human("Human1", 123);
    Human fH = new Human("pHuman1", 158);
    h.parent = fH;
    h добавляем в список List<Human> peoples и передаем peoples в отчет.
    Так вот, если в отчете положить на бэнд поле [Peoples.parent.parent], то дизайнер выдает ошибку Text1: error CS0246: The type or namespace 'Human" could not be found....
    Это происходит, как я понимаю, из-за того что ссылка на этот объект равна null (у fH parent не присвоен).
    Но если сначала построить отчет, а потом на бэнд добавить это поле, то ошибка уже не появляется и значение поля при построении отчета равно 0, при этом поле parent в соваре данных в дизайнере имеет тип Int32 :) .
    Откуда выползает тип поля Int32 и нельзя ли сразу задавать значение по умолчанию без предваритьельного построения?
  • отредактировано 06:38
    Такого типа ссылки допускают только 2 уровня вложенности, т.е. максимум - Peoples.parent. Возможно, эту часть также придется переделывать под maxNestingLevel.
  • отредактировано 06:38
    переделал, ждите очередную сборку сегодня ночью.
  • отредактировано 06:38
    Спасибо за оперативность, завтра посмотрю и доложу о результатах :)
  • отредактировано 06:38
    Если опять создать экземпляры
    Human h = new Human("Human1", 123);
    Human fH = new Human("pHuman1", 158);
    h.parent = fH;
    
    h добавляем в список List<Human> peoples и
    report.RegisterData(peoples, "Peoples", FastReport.Data.BOConverterFlags.AllowFields, 5);
    report.Design();
    
    1. В дизайнере тип поля parent определяется как Human (в DataType стоит Human).
    2. После запуска отчета на выполнение и закрытия окна превью DataType поля parent пустое.
    3. если после того как поле DataType стало пустым, поместить на бэнд например [Peoples.parent.Name] и опять построить отчет и закрфть превью, то
    3.1 Прежде чем вернуться в дизайнер программа подвисает на 1-3 секунды.
    3.2 После возвращения в дизайнер поле DataType имеет тип Int32.
  • отредактировано 06:38
    Да, внешние типы не восстанавливаются должным образом. Имя типа записывается в файл отчета в виде "Demo.Form1+Human", а надо бы "Demo.Form1+Human, Demo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null". Правда, если изменится версия dll, содержащей тип, то все равно тип не сможет быть восстановлен. Но ведь на работу FastReport это не влияет! Разве что если захотите работать с полем "parent" в коде отчета.
    Про 1-3 секунды, не заметил такого. Но у меня достаточно быстрая (E8600) машина.
  • отредактировано 06:38
    AlexTZ написал: »
    ... Разве что если захотите работать с полем "parent" в коде отчета.

    угу, вот если с ним работать возникают ошибки. У класса Human, например, перегружаем ToString(), чтоб возвращал имя экземпляра. После передачи данных и запуска дизайнера кладем на бэнд поля [Peoples.parent] и [Peoples.parent.parent] (второе равно null), вылетает ошибка
    FastReport.Net v1.0.189
    Object reference not set to an instance of an object.
    at tffUfY8do511hfsyvy.F9PPoLSYHL61puNRYU.UKvVX40D3E(String , Type )
    at qLiXubkjoAMppm0K3A.AQtcXf1QmwPPtufvvt.8gyF538Ux(String )
    at qLiXubkjoAMppm0K3A.AQtcXf1QmwPPtufvvt.8UGTxCls0(String , Base , Boolean )
    at qLiXubkjoAMppm0K3A.AQtcXf1QmwPPtufvvt.fb03afKFG()
    at FastReport.Report.XBN3QFtVj()
    at FastReport.Report.Prepare(Boolean append)
    at FastReport.Report.Prepare()
    at i3SVixdYaMXZa7crmRM.O0cYfUdDREtqaIB9T2M.rukKJDUF4()

    убираем второе поле, строим отчет, закрываем превью, опять кладем второе поле. Ошибки уже нет, поле имеет значение 0 и тип Int32.

    Есть ли возможность
    1. Сделать так, чтоб поля со значением null, например, сразу бы устанавливались как Int32 со значением по умолчанию?
    2. Расширить список DataType`ов самого FastReport. С помощью dll`ки, содержащей новый(новые) тип, например.
  • отредактировано 06:38
    1) я могу просто исправить ошибку - если [Peoples.parent.parent] = null, то будет печататься пустая строка
    2) это исправил, посторонние типы теперь восстанавливаются корректно.
  • отредактировано 06:38
    1. Да, это будет корректно.
    2. Спасибо.

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

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