Missingmethodexception

kalina9001kalina9001 Germany
отредактировано 07:23 Раздел: FastReport .NET
При:
report.RegisterData(bindingSource, "MyData");
Получаю MissingMethodException с сообщением о том, что не найден конструктор типа листа приатаченного к BindingSource.
В StackTrace только:
StackTrace:
       bei System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
  InnerException:
Похоже, что ошибка возникает только с классами не имеющими конструктора без параметров но, на тестовом примере ошибка не воспроизводится :)

Зачем там вызов конструктора?

Комментарии

  • отредактировано 07:23
    Так работает компонент BindingSource, я всего лишь использую список пропертей, которые он мне возвращает. Чтобы полностью раскрыть структуру данных бизнес-объекта, BindingSource может потребоваться создание экземпляра списка, чтобы выяснить тип элемента списка. Например, если у бизнес-объекта есть св-во

    public MyCollection Items;

    BindingSource может создать экземпляр типа MyCollection и посмотреть, какого типа элемент коллекции.
  • kalina9001kalina9001 Germany
    отредактировано 07:23
    Опытным путем выяснил, что Exception вылазит только для списков имплементирующих интерфейс ITypedList.
    Самое смешное, что я сам вызываю
    bindingSource.GetItemProperties(null);
    
    тремя строчками выше перед регистрацией данных и ошибка не появляется. :)

    Не мог бы ты взглянуть, на тестовый пример:
    http://rapidshare.de/files/47576051/FR.rar.html

    Места на которые стоит обратить внимание я отметил так: //AlexTZ


  • kalina9001kalina9001 Germany
    отредактировано 07:23
    BTW Ошибка в экспорте в Image при включенной опции "Separate file for each page" в выбранную папку пишется только первый файл, остальные в WorkDirectory
  • отредактировано 07:23
    Ошибку повторить легко:
            private void toolStripButton1_Click(object sender, EventArgs e)
            {
                BindingSource source = new BindingSource();
                source.DataSource = typeof(FRTestGui.TestItem.TestItemListEx);
            }
    

    (класс TestItemListEx надо сделать public, чтобы к нему можно было достучаться из этого кода).

    Чтобы исправить ошибку, нужен конструктор без параметров:
    public class TestItemListEx: TestItemList
    {
      public TestItemListEx()
      {
      }
    
  • kalina9001kalina9001 Germany
    отредактировано 07:23
    AlexTZ написал: »
    Ошибку повторить легко:
            private void toolStripButton1_Click(object sender, EventArgs e)
            {
                BindingSource source = new BindingSource();
                source.DataSource = typeof(FRTestGui.TestItem.TestItemListEx);
            }
    

    (класс TestItemListEx надо сделать public, чтобы к нему можно было достучаться из этого кода).

    А зачем это делается в FastReport? Чтобы получить список свойств? Не проще ли сразу DataSource присвоить переданную коллекцию и получить желаемое вызовом GetItemProperties?
    AlexTZ написал: »
    Чтобы исправить ошибку, нужен конструктор без параметров:
    public class TestItemListEx: TestItemList
    {
      public TestItemListEx()
      {
      }
    
    Это к сожалению не возможно, в конструктор листов у меня передается информация на основании которой и формируется список свойств для зарегистрированного пользователя (видимость, доступность только для чтения и.т.д
  • отредактировано 07:23
    В FastReport передается тип объекта, а не "живой" объект. Вся работа идет с типами. Если работать с живыми объектами, проблему это полностью не решит: если значение св-ва окажется = null, BindingSource возьмет его тип, а дальше Вы уже знаете что будет :)
  • отредактировано 07:23
    Кстати, когда делаете в Visual Studio "Add New Datasource" из объекта, создается новый источник данных, который представляет именно тип объекта. И BindingSource, привязанный к этому источнику, работает с ним как с типом.
  • kalina9001kalina9001 Germany
    отредактировано June 2009
    AlexTZ написал: »
    В FastReport передается тип объекта, а не "живой" объект. Вся работа идет с типами. Если работать с живыми объектами, проблему это полностью не решит: если значение св-ва окажется = null, BindingSource возьмет его тип, а дальше Вы уже знаете что будет :)
    Понятно, я пока дизайнер не крутил. Все из кода. Старая закалка :)
    Придется городить прокси классы.
    Но все равно не понятно что даст typeof(null) в выше озвученном примере

    ЗЫ. В документации стоит указать для первого параметра функции RegisterData(IEnummerable,... необходимость конструктора без параметров
  • отредактировано 07:23
    Я могу слегка переделать работу движка, так, чтобы он использовал живой объект вместо типа. Но - это будет работать только для корневого объекта. Все вложенные списки будут обрабатываться исключительно на основе типов.
  • kalina9001kalina9001 Germany
    отредактировано 07:23
    AlexTZ написал: »
    Я могу слегка переделать работу движка, так, чтобы он использовал живой объект вместо типа. Но - это будет работать только для корневого объекта. Все вложенные списки будут обрабатываться исключительно на основе типов.

    Было бы просто замечательно!
  • отредактировано 07:23
    Уже переделал, тестовый проект теперь работает нормально.
    Новая версия соберется в полночь.
  • kalina9001kalina9001 Germany
    отредактировано 07:23
    AlexTZ написал: »
    Уже переделал, тестовый проект теперь работает нормально.
    Новая версия соберется в полночь.
    Спасибо!

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

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