Как мне запретить Visual Studio генерировать вызовы Setter в моем UserControl?

#c# #winforms #visual-studio #visual-studio-2010 #code-generation

#c# #winforms #visual-studio #visual-studio-2010 #генерация кода

Вопрос:

Я создал пару элементов управления, которые наследуются от UserControl для моего приложения Winform. Они оба имеют конструкторы без параметров, как и требуется. Когда я переношу их в свою основную форму, я получаю ошибку в Visual Studio во время разработки, когда она не может отобразить форму.

Я обнаружил, что в файле Designer.cs формы, где создается экземпляр моего элемента управления, IDE помещает туда строку, которая вызывает один из моих установщиков. BlockKey = 0 . Ну, код, стоящий за установщиком, вызывает какой-то другой код, и быстро генерируется исключение NullReferenceException, потому что форма не запущена; этот другой код не готов к созданию чего-либо в этот момент.

Если я вручную удалю строку setter, ошибка исчезнет. Но при закрытии и повторном открытии или повторной компиляции IDE снова вставляет строку обратно. Я попытался украсить внутри UserControl установщик с помощью [DefaultValue(false)] , думая, что это подавит вызов установщика во время разработки, но этого не произошло.

Как я могу избавиться от этой строки в конструкторе? Или я должен вместо этого написать какой-нибудь превентивный код внутри setter?

Ответ №1:

Вы должны использовать DesignerSerializationVisibilityAttribute атрибут в своем свойстве, установив для него значение Hidden .

 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int BlockKey
{
    get { return 0; }
    set { /* Do something */ }
}
  

В качестве альтернативы, если вам нужна более конкретная логика (т. Е. сериализовать только в определенных условиях), вы должны создать функцию, которая возвращает bool и имеет конкретное имя в формате bool ShouldSerialize*PropertyName*()

 bool ShouldSerializeBlockKey()
{
     return false;
}
  

(ПРИМЕЧАНИЕ: я забыл, должна ли эта функция быть общедоступной или нет …)

Комментарии:

1. О, кстати, DefaultValue атрибут — это то, что окно свойств дизайнера будет использовать для включения функции сброса по щелчку правой кнопкой мыши.

2. Вот документ о более ручном методе ShouldSerialize — msdn.microsoft.com/en-us/library/53b8022e (v = vs.71).aspx

3. Есть ли что-то подобное для методов? В моем конструкторе у меня есть вызов другого метода, который обращается к базе данных за некоторыми данными для заполнения поля со списком. Этот вызов снова приводит к сбою формы во время разработки. Какова наилучшая практика в этом?

4. Если это так, то вам придется использовать свойство protected DesignMode для разделения кода, не связанного с разработчиком.

Ответ №2:

То, что вы ищете, это DesignerSerializationVisibilityAttribute . Это определяет, будет ли дизайнер сериализовывать значения по умолчанию для определенного атрибута или нет

Если вы укажете свойства как Hidden , дизайнер не добавит для них значения