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

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

Упражнение 2. Создание невизуального компонента Planets

В этом примере мы создадим невизуальный компонент Planets, инкапсулирующий в себе названия планет Солнечной системы, и добавим его в нашу библиотеку компонентов сборки MyComponents. Названия планет будут храниться во внутреннем массиве компонента, а доступ к ним будет осуществляться через индексаторы по имени планеты или ее индексу.

  • В панели Solution Explorer выделите проект MyComponents и выполните команду меню Project/Add Component, чтобы добавить файл Planets.cs нового компонента
  • Дополните содержимое файла, автоматически сгенерированное мастером, следующим кодом
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Collections;
    
namespace MyCompany.MyComponents
{
    public partial class Planets : Component
    {
        public Planets()
        {
            InitializeComponent();
        }
    
        public Planets(IContainer container)
        {
            container.Add(this);
    
            InitializeComponent();
        }
    }
}
    
namespace MyCompany.MyComponents
{
    partial class Planets
    {
        // Планеты
        private string[] PlanetNames ={ "Меркурий",
                                        "Венера",
                                        "Земля",
                                        "Марс",
                                        "Юпитер",
                                        "Сатурн",
                                        "Уран",
                                        "Нептун",
                                        "Плутон"
        };
    
        // Вернуть имя
        private string GetPlanetName(int index)
        {
            // Нижняя и верхняя границы массива
            int lowP = 0, highP = PlanetNames.Length - 1;
    
            // Контролирует диапазон индекса планеты и возвращает
            // ее название или генерирует исключение
            if (index < lowP || index > highP)
            {
            MessageBox.Show(String.Format("Индекс 
		должен находиться в диапазоне {0}-{1}",
               lowP, highP));
            index = 0;
            }
    
            return PlanetNames[index];
        }
    
        // Вернуть индекс
        private int GetPlanetPosition(string planetName)
        {
            // Сравниваем переданное имя планеты с массивом
            // PlanetNames. При несовпадении возвращаем -1 
            int result=-1;
            for(int i=0; i<PlanetNames.Length;i++)
                if (String.Compare(planetName, PlanetNames[i], true) == 0)
                {
                    result = i;
                    break;
                }
    
            return result;
        }
    
        // Свойство - индексатор: возвращает имя планеты по индексу
        public string this[int index]
        {
            get {return GetPlanetName(index); }
        }
    
        // Свойство - индексатор: возвращает индекс планеты по имени
        public int this[string planetName]
        {
            get { return GetPlanetPosition(planetName); }
        }
    
        // Свойство максимального размера массива
        public int MaxIndex
        {
            get { return PlanetNames.Length - 1; }
        }
    }
}
Листинг 18.8 . Расширенное содержимое файла Planets.cs

В коде мы объявили массив с планетами и сразу инициализировали его. Создали два внутренних контролирующих метода, возвращающих название планеты по ее индексу и наоборот. Добавили два общедоступных свойства - индексатора, позволяющих работать с экземпляром компонента как с массивом, а также добавили общедоступное свойство максимального размера поля - массива с планетами.

Теперь осталось перекомпилировать сборку MyComponents.dll, в которой в одном пространстве имен MyCompany.MyComponents будут находиться уже два наших компонента, и испытать новый невизуальный компонент.

  • В панели Solution Explorer вызовите контекстное меню для узла проекта MyComponets и выполните команду Rebuild, чтобы перекомпилировать проект с компонентами
  • Убедитесь, что в панели Toolbox появился новый компонент Planets, который теперь можно перетаскивать на форму также, как и обычный библиотечный компонент
Максим Филатов
Максим Филатов

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

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

 

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

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