Пользовательские компоненты
Установка значений свойств компонента по умолчанию
Обратите внимание, что значения введенных нами свойств компонента отображаются в панели Properties жирным шрифтом. При работе с библиотечными компонентами мы привыкли, что жирным шрифтом отображаются только измененные значения свойств, отличные от настроек по умолчанию. Это именно те значения, которые визуальный конструктор форм оболочки автоматически присваивает свойствам в методе InitializeComponent() секции #region.
- Чтобы убедиться в этом, откройте в панели Solution Explorer файл Form1.Designer.cs тестового проекта ComponentTest:
#region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); MyCompany.MyComponents.SomeObject someObject1 = new MyCompany.MyComponents.SomeObject(); this.firstComponent1 = new MyCompany.MyComponents .FirstComponent(this.components); this.SuspendLayout(); // // firstComponent1 // this.firstComponent1.BackColor = System.Drawing.Color.Red; this.firstComponent1.BoolProp = false; this.firstComponent1.CharProp = '\0'; this.firstComponent1.EnumProp = MyCompany.MyComponents.EnumType.Zero; this.firstComponent1.IntegerProp = 0; this.firstComponent1.Location = new System.Drawing.Point(233, 139); this.firstComponent1.Name = "firstComponent1"; this.firstComponent1.Size = new System.Drawing.Size(75, 23); someObject1.Prop1 = 2008; someObject1.Prop2 = "Привет"; this.firstComponent1.SomeObj = someObject1; this.firstComponent1.StringProp = "По умолчанию"; this.firstComponent1.TabIndex = 5; this.firstComponent1.Text = "firstComponent1"; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(415, 190); this.Controls.Add(this.firstComponent1); this.MaximizeBox = false; this.Name = "Form1"; this.Text = "Испытание компонентов"; this.ResumeLayout(false); this.PerformLayout(); } #endregionЛистинг 24.6. Секция, автоматически генерируемая конструктором форм
Для того, чтобы заставить оболочку в отношении некоторых значений свойств не воспринимать их как измененные, нужно присоединить к этим свойствам атрибут [DefaultValue] с теми значениями, которые она должна считать заданными по умолчанию. В результате при компиляции в код компонента будет встроена дополнительная информация, какие значения свойств считать базовыми и пока они не изменены пользователем, специально не присваивать при создании экземпляра компонента на форме.
- В файле FirstComponent.cs присоедините к некоторым свойствам атрибут [DefaultValue] информирования среды, какие значения считать базовыми
using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using System.Collections; namespace MyCompany.MyComponents { public partial class FirstComponent : Control { public FirstComponent() { InitializeComponent(); Init(); } public FirstComponent(IContainer container) { container.Add(this); InitializeComponent(); Init(); } } } namespace MyCompany.MyComponents { // Определяем перечисление public enum EnumType { Zero, One, Two, Three }; partial class FirstComponent { // Локальные поля int integerProp; string stringProp = "По умолчанию"; char charProp; bool boolProp = false; EnumType enumProp = EnumType.Zero; SomeObject someObject; // Общедоступные свойства для локальных полей public int IntegerProp { get { return integerProp; } set { integerProp = value; } } [DefaultValue("По умолчанию")] // Атрибут значения по умолчанию public string StringProp { get { return stringProp; } set { stringProp = value; } } public char CharProp { get { return charProp; } set { charProp = value; } } [DefaultValue(false)] // Атрибут значения по умолчанию public bool BoolProp { get { return boolProp; } set { boolProp = value; } } [DefaultValue(EnumType.Zero)] // Атрибут значения по умолчанию public EnumType EnumProp { get { return enumProp; } set { enumProp = value; } } // Сложное свойство - объект public SomeObject SomeObj { get { return someObject; } set { someObject = value; } } void Init() { someObject = new SomeObject(); this.BackColor = System.Drawing.Color.Red; } } } namespace MyCompany.MyComponents { // Присоединяем атрибут с контролирующим классом для возможности // редактирования свойств объекта в панели Properties оболочки [TypeConverter(typeof(SomeObjectConverter))] //[TypeConverter(typeof(ExpandableObjectConverter))] public class SomeObject : Object { int prop1; string prop2; // Свойства [DefaultValue(2008)] // Атрибут значения по умолчанию public int Prop1 { get { return prop1; } set { prop1 = value; } } [DefaultValue("Привет")] // Атрибут значения по умолчанию public string Prop2 { get { return prop2; } set { prop2 = value; } } // Инициализация полей через конструктор public SomeObject() { prop1 = 2008; prop2 = "Привет"; } } }Листинг 24.7. Присоединение к некоторым свойствам компонента атрибута [DefaultValue]
- Откомпилируйте проект MyComponents, удалите с формы Form1 компонент firstComponent1 и вновь поместите его на форму из панели Toolbox, чтобы оболочка перегенерировала код в секции #region
Если теперь вновь посмотреть содержимое файла Form1.Designer.cs, то мы не увидим явного присвоения начальных значений свойствам экземпляра компонента, помеченным атрибутом [DefaultValue]. Явное присвоение появится только тогда, когда пользователь компонента задаст свойствам новые значения, отличные от установленных атрибутом.