Пользовательские свойства, определенные в базовой форме, теряют свое состояние в унаследованной форме при перестройке

У меня проблемы со свойствами базовой формы, не поддерживающими состояние в унаследованной форме.

Среда:

  • Visual Studio 2010 Ultimate Service Pack 1: Версия 10.0.40219.1 SP1Rel
  • .Net Framework: версия 4.0.30319 SP1Rel
  • Windows 7 Ultimate

Ниже приведен исходный код и шаги для воспроизведения:

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace Test
{
    public partial class BaseForm : Form
    {
        [DefaultValueAttribute(true)]
        public bool ControlVisible
        {
            get
            {
                return this.checkBox1.Visible;
            }
            set
            {
                this.checkBox1.Visible = value;
            }
        }

        [DefaultValueAttribute(false)]
        public bool ControlChecked
        {
            get
            {
                return this.checkBox1.Checked;
            }
            set
            {
                this.checkBox1.Checked = value;
            }
        }

        public BaseForm()
        {
            InitializeComponent();
        }
    }
}

В приведенном выше примере свойства по умолчанию совпадают с [DefaultValueAttribute], т.е. InitializeComponent () checkBox1.Visible имеет значение true, а checkBox1.Checked - false. Это настройки по умолчанию для элемента управления при перетаскивании в форму.

Затем я создал следующую унаследованную форму:

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : BaseForm
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}

Проблема и шаги для воспроизведения:

  1. Когда я открываю Form1 в конструкторе, свойства следующие состояние.

    Состояние: ControlChecked = False - ControlVisible = True (жирный)

    ControlVisible установлен на True , как и ожидалось, однако он выделен жирным шрифтом. [DefaultValueAttribute] установлен на true в базовой форме, поэтому я ожидал, что это свойство не будет выделено жирным шрифтом.

  2. Теперь я изменяю ControlVisible на False в конструкторе. Полужирный шрифт отключается.

    Состояние: ControlChecked = False - ControlVisible = False

  3. Теперь я перестраиваю проект, и код в Form1 восстанавливается. Свойство ControlVisible возвращается к True жирным шрифтом.

    Состояние: ControlChecked = False - ControlVisible = True (жирный)

  4. Я изменяю ControlChecked с False на True , и он становится жирным, как и ожидалось.

    Состояние: ControlChecked = True (жирный) - ControlVisible = True (жирный)

  5. Я перестраиваю проект, без изменений.

    Состояние: ControlChecked = True (жирный) - ControlVisible = True (жирный)

  6. Теперь я изменяю свойство ControlVisible с True на False и заново строю проект. ControlVisible возвращен к True жирным шрифтом.

    Состояние: ControlChecked = True (жирный) - ControlVisible = True (жирный)

ControlChecked , похоже, работает должным образом. ControlVisible продолжает переключаться обратно на True , когда для него установлено значение false, а жирный шрифт меняется на противоположное. Мне кажется, что каким-то образом [DefaultAttributeValue] из true в базовой форме не распознается.

Обновление: Отредактировано, чтобы исправить ошибку и более точно изолировать проблему.

Обновление: Если я установил checkBox1.Visible = false в конструкторе BaseForm, все будет работать, как ожидалось. Итак, в итоге получается, что проблема заключается в том, чтобы получить атрибут DefaultValueAttribute true для распознавания в настраиваемом свойстве в унаследованной форме.

5
задан Elan 29 July 2011 в 14:50
поделиться