В настоящее время я создаю пользовательскую форму .Net с использованием C# и заполняю ее настраиваемыми пользовательскими элементами управления. У каждого элемента управления есть метод доступа, который получает и устанавливает объект, содержащий данные, которыми будет заполнен элемент управления.
Во время выполнения все работает отлично, но во время разработки я получаю ошибки в конструкторе форм. Ошибки всегда связаны со строками «Невозможно преобразовать объект типа [ObjectA] в объект типа [ObjectA]».
На этом этапе я могу перейти в файл resx и удалить строку, которая ссылается на объект типа ObjectA, а затем перейти в файл designer.cs и удалить строку в InitializeComponent, которая устанавливает аксессор элемента управления на данные из resx файл.
Как только я это сделаю, форма будет отображаться в дизайнере до тех пор, пока он не перестроит InitializeComponet и не вставит строки / данные в resx и InitializeComponent.
Что мне не хватает в моем элементе управления и дизайне класса, который завершит этот цикл? Я пробовал использовать режим использования Liscence и режим выполнения Designer со смешанными результатами, и я бы предпочел, если бы я мог решить эту проблему в своем дизайне.
Спасибо за любую помощь, которую вы можете оказать.
Обновление: я добавил атрибут ...
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
К свойству, и я получил ошибку в дизайнере «ObjectA is null, this is not allowed!», Поэтому я изменил строку на ...
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
и проблема ушла. Поскольку мне не нужно устанавливать какие-либо из этих свойств во время разработки, вероятно, более уместен атрибут hidden.
Спасибо.





Вот пример кода, учитывающего время разработки, в пользовательском элементе управления:
protected override void OnPaintBackground(PaintEventArgs e)
{
if (this.DesignMode)
{
base.OnPaintBackground(e);
}
}
Это может не сработать для вас, но если вы заключите любой проблемный код в блок «if (**! ** this.DesignMode) {}», все будет в порядке (если вам не нужен этот код для правильного отображения элемента управления в расчетный режим).
Похоже, это может быть способ сериализации объекта.
Дизайнер выполняет двоичную сериализацию объекта в файл resx, вам, вероятно, понадобится код, который будет создан в вашем файле .Designer.cs.
Попробуйте поместить в свойство следующую строку атрибута: [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]