Создание пользовательских элементов управления .Net

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

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

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

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

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

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

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

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

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

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

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

Спасибо.


person bill_the_loser    schedule 25.11.2008    source источник


Ответы (2)


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

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

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

person benPearce    schedule 25.11.2008

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

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

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

person MusiGenesis    schedule 25.11.2008