Создание пользовательских элементов управления .Net - PullRequest
1 голос
/ 26 ноября 2008

В настоящее время я создаю пользовательскую форму .Net с использованием C # и заполняю ее пользовательскими элементами управления. У каждого элемента управления есть средство доступа, которое получает и устанавливает объект, содержащий данные, которыми будет заполнен элемент управления.

Во время выполнения все отлично работает, но во время разработки я получу ошибки в конструкторе форм. Ошибки всегда имеют вид «Не удается преобразовать объект типа [ObjectA] в объект типа [ObjectA]»

На этом этапе я могу зайти в файл resx и удалить строку, которая ссылается на объект типа ObjectA, а затем перейти в файл designer.cs и удалить строку в InitializeComponent, которая устанавливает метод доступа к данным для элемента управления из файла resx.

Как только я это сделаю, форма будет отображаться в конструкторе, пока она не перестроит InitializeComponet и не вставит строки / данные в resx и InitializeComponent.

Чего мне не хватает в моем контроле и дизайне классов, которые завершат этот цикл? Я пытался использовать режим использования Liscence и режим конструктора со смешанными результатами, и я бы предпочел, чтобы я мог решить эту проблему в своем проекте.

Спасибо за любую помощь, которую вы можете оказать.

Обновление: я добавил атрибут ...

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

В свойство, и я получил ошибку в конструкторе «ObjectA имеет значение null, это не разрешено!», Поэтому я изменил строку на ...

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

и проблема ушла. Поскольку мне не нужно устанавливать какое-либо из этих свойств во время разработки, скрытый атрибут, вероятно, более уместен.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 26 ноября 2008

Похоже, это может быть способ сериализации объекта.

Дизайнер выполняет двоичную сериализацию объекта в файл resx. Вероятно, вам понадобится код, который будет создан в вашем файле .Designer.cs.

Попробуйте добавить следующую строку атрибута в свойство: [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]

0 голосов
/ 26 ноября 2008

Вот пример кода, учитывающего время разработки, в пользовательском элементе управления:

protected override void OnPaintBackground(PaintEventArgs e)
{
    if (this.DesignMode)
    {
        base.OnPaintBackground(e);
    }
}

Это может не сработать, но если вы поместите какой-либо проблемный код в блок «if (**! ** this.DesignMode) {}», у вас все будет в порядке (если вам не нужен этот код для элемента управления, чтобы правильно отображать в режиме разработки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...