У меня возникли проблемы со свойствами базовой формы, не поддерживающими состояние в унаследованной форме.
Окружающая среда:
- Пакет обновления 1 для Visual Studio 2010 Ultimate: версия 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();
}
}
}
Проблема и действия по воспроизведению:
Когда я открываю Form1 в конструкторе, свойства находятся в следующем состоянии.
Состояние: ControlChecked = False — ControlVisible = True (жирный шрифт)
Для параметра ControlVisible задано значение True, как и ожидалось, однако оно выделено полужирным шрифтом. [DefaultValueAttribute] имеет значение true в базовой форме, поэтому я ожидал, что это свойство не будет выделено полужирным шрифтом.
Теперь я изменяю ControlVisible на False в дизайнере. Жирный выключается.
Состояние: ControlChecked = False — ControlVisible = False
Теперь я перестраиваю проект, и код в Form1 регенерируется. Свойство ControlVisible возвращается к значению True, выделенному полужирным шрифтом.
Состояние: ControlChecked = False — ControlVisible = True (жирный шрифт)
Теперь я изменяю ControlChecked с False на True, и он становится жирным, как и ожидалось.
Состояние: ControlChecked = True (жирный шрифт) — ControlVisible = True (жирный шрифт)
Пересобираю проект и никаких изменений.
Состояние: ControlChecked = True (жирный шрифт) — ControlVisible = True (жирный шрифт)
Теперь я изменяю свойство ControlVisible с True на False и снова перестраиваю проект. Для параметра ControlVisible снова выбрано значение True, выделенное полужирным шрифтом.
Состояние: ControlChecked = True (жирный шрифт) — ControlVisible = True (жирный шрифт)
ControlChecked работает должным образом. ControlVisible продолжает возвращаться к True, когда для него задано значение false и полужирный шрифт перевернут. Мне кажется, что каким-то образом [DefaultAttributeValue] true в базовой форме не распознается.
Обновление: исправлено, чтобы исправить ошибку и более точно изолировать проблему.
Обновление: если я устанавливаю checkBox1.Visible = false в конструкторе BaseForm, то все работает как положено. Таким образом, в итоге получается, что проблема заключается в том, чтобы DefaultValueAttribute true распознавался в пользовательском свойстве в унаследованной форме.