Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 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. Ввожу код на сайте, пишет:

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

 

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