Как остановить Visual Studio от генерации установочных вызовов в моем UserControl? - PullRequest
3 голосов
/ 20 апреля 2011

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

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

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

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

bool ShouldSerializeBlockKey()
{
     return false;
}

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

2 голосов
/ 20 апреля 2011

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

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

...