Пользовательские компоненты
Установка значений свойств компонента по умолчанию
Обратите внимание, что значения введенных нами свойств компонента отображаются в панели 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]. Явное присвоение появится только тогда, когда пользователь компонента задаст свойствам новые значения, отличные от установленных атрибутом.