Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 18:

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

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

Обратите внимание, что значения введенных нами свойств компонента отображаются в панели 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
Листинг 18.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 = "Привет";
    }
    }
}
Листинг 18.7 . Присоединение к некоторым свойствам компонента атрибута [DefaultValue]
  • Откомпилируйте проект MyComponents, удалите с формы Form1 компонент firstComponent1 и вновь поместите его на форму из панели Toolbox, чтобы оболочка перегенерировала код в секции #region

Если теперь вновь посмотреть содержимое файла Form1.Designer.cs, то мы не увидим явного присвоения начальных значений свойствам экземпляра компонента, помеченным атрибутом [DefaultValue]. Явное присвоение появится только тогда, когда пользователь компонента задаст свойствам новые значения, отличные от установленных атрибутом.

Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974