Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 891 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 24:

Пользовательские компоненты

Установка значений свойств компонента по умолчанию

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