#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
, дизайнер не добавит для них значения