Я работаю над приложением winforms. У меня есть форма под названием «MainForm», которая содержит пользовательский элемент управления. В пользовательском элементе управления есть флажок, который в некоторых сценариях должен быть скрыт - поэтому я создал для него свойство. Проблема в том, что всякий раз, когда я открываю основную форму и вношу в нее какие-либо изменения, дизайнер меняет это свойство на false, поэтому флажок в элементе управления не отображается.

Есть ли способ предотвратить такое поведение? (Я использую VS2012)

ОБНОВИТЬ:

В коде за моим контролем у меня есть свойство

 public bool IsWebOmmitVisable
    {
        get { return ommitCheckBox.Visible; }
        set { ommitCheckBox.Visible = value; }
    }

В конструкторе элемента управления выставил значение true:

 public myControl()
    {
        InitializeComponent();
        IsWebOmmitVisable = true;
...

Однако, похоже, это не имеет значения.
Затем я добавляю этот элемент управления в MainForm. Свойство видно в свойствах элемента управления. Однако всякий раз, когда я изменяю любой из элементов в MainForm, для свойства устанавливается значение false.

http://i.stack.imgur.com/0fSvQ.jpg

0
Be Esz 6 Сен 2016 в 17:55

3 ответа

Лучший ответ

Использование DesignerSerializationVisibilityAttribute предотвратит сериализацию свойства в дизайнер.

   [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public bool IsWebOmmitVisable
    {
        get { return ommitCheckBox.Visible; }
        set { ommitCheckBox.Visible = value; }
    }

По ссылке:

С помощью атрибута DesignerSerializationVisibilityAttribute вы можете указать, является ли значение свойства Visible и должно ли оно сохраняться в коде инициализации, Hidden и не должно сохраняться в коде инициализации, или состоит из Content, который должен иметь код инициализации, сгенерированный для каждого общедоступного, не скрытое свойство объекта, присвоенное этому свойству. Члены, у которых нет атрибута DesignerSerializationVisibilityAttribute, будут обрабатываться так, как если бы они имели атрибут DesignerSerializationVisibilityAttribute со значением Visible. Значения свойства, отмеченного как Visible, будут сериализованы, если это возможно, с помощью сериализатора для типа . Чтобы указать настраиваемую сериализацию для определенного типа или свойства, используйте атрибут DesignerSerializerAttribute.

1
Mark Hall 6 Сен 2016 в 16:14

изображение простой формы

И код внутри Form1.cs

private void Form1_Load(object sender, EventArgs e)
{
    textBox1.Visible = false;
}

private void button1_Click(object sender, EventArgs e)
{
    textBox1.Visible = !textBox1.Visible;
}

И работает отлично как надо. (Кнопка переключает свойство Visible текстового поля.) Я не уверен, на каком этапе вы пошли не так.

Form1_Load был автоматически создан двойным щелчком по заголовку формы в дизайнере.

button1_Click был автоматически сгенерирован двойным щелчком кнопки button1 в дизайнере.

0
mfc 6 Сен 2016 в 15:08

В окне свойств выберите класс основной формы, затем щелкните вкладку событий (значок молнии), затем дважды щелкните событие загрузки, это добавит событие загрузки в форму, здесь вы можете установить для видимого значения false или true, если вы желаю установить флажок

    private void MainForm_Load(object sender, EventArgs e)
    {
        mycheckbox.Visible = false;
    }
0
Hasson 6 Сен 2016 в 15:11