Главная » C#, Компоненты » Работа с именами и типами компонентов

0

При необходимости получить компонент по имени или типу используется сервис iReferenceService. Вот его основные методы:

?      метод string GetName (object reference) ВОЗВращает ИМЯ компонента;

?          метод object GetReference(string ла/пе) возвращает компонент по имени. Если компонент с таким именем не найден, метод вернет null;

?          метод object [] GetReferences (Type baseType) возвращает все компоненты указанного типа;

?          метод object п GetReferences о возвращает все объекты, доступные в режиме разработки. При этом следует помнить, что не все они являются компонентами — в этот список входят и объекты дизайнеров.

В листинге 7.7 показан пример использования сервиса IReferenceService. Результатом его работы (рис. 7.2) является сообщение о наличии компонентов того же типа, что и текущий выбранный. Для этого я сначала регистрирую обработчик смены выбранного компонента с помощью сервиса iseiectionservice, а уже в этом обработчике собирают необходимую информацию.

Листинг 7 7 Использование сервиса lKbfecexicebex-vo.ee

using System;

using System.Collections;

using System.ComponentModel;

using System.ComponentModel.Design;

using System.Drawing;

using System.Data;

using System.Windows.Forms;

using System.Text;

using System.Collections.Generic?

namespace ReferenceServiceExample

{

public class ReferenceServiceControl :

System.Windows.Forms.UserControl

{

// Хранит отображаемые строки private List<string> drawLines;

// Ссылка на интерфейс сервиса ISelectionService private ISelectionService selectionService;

public ReferenceServiceControl() (

// Свойства компонента this.BackColor = Color.White;

this.SetStyle(ControlStyles.ResizeRedraw, true);

this.Name = "ReferenceServiceControl";

this.Size — new System.Drawing.Size (500, 250);

// Инициализируем свойства drawLines – new List<string>(); selectionService = null;

}

// Перекрываем свойство Site, чтобы иметь возможность // обработать событие OnSelectionChanged public override System.ComponentModel.ISite Site (

get {

return base.Site;

}

set {

// Если обработчик уже зарегистрирован, удаляем его if (selectionService ! = null)

selectionService.SelectionChanged —

new EventHandler(this.OnSelectionChanged);

// Сохраняем значение свойства Site. Оно может быть null, // если компонент находится не в режиме разработки base.Site – value;

// Получаем интерфейс сервиса и устанавливаем обработчик selectionService = (ISelectionService)

this.GetService(typeof(ISelectionService));

if (selectionService !- null) {

selectionService.SelectionChanged +=

new EventHandler(this.OnSelectionChanged);

// Обновить вид компонента RefreshSelection();

}

}

}

private void RefreshSelection()

{

drawLines = new List<string>();

if (selectionService.PrimarySelection = null)

{

drawLines.Add("Ни один компонент не выбран");

this.Refresh();

return;

}

drawLines.Add(string.Format("Выбран компонент (0) тип {!}", ( (IComponent)selectionService.PrimarySelection).Site.Name, selectionService.PrimarySelection.GetType().FullName));

// Получаем интерфейс сервиса IReferenceService rs – (IReferenceService)

this.GetService(typeof(IReferenceService));

if (rs !- null) {

// Метод GetName возвращает имя компонента

string name = rs.GetName{selectionService-PrimarySelection); drawLines.Add(string.Format("GetName()={0)name));

// Ищем все ссылки на компоненты того же типа, // как у текущего выбранного

drawLines.Add(string.Format("Компоненты такого же типа:")); object 1] components — rs.GetReferences(

selectionService.PrimarySelection.GetType());

foreach (IComponent component in components)

{

drawLines.Add(string.Format(" {0}", component.Site.Name));

}

}

this.Refresh();

private void OnSelectionChanged(object sender, EventArgs e) (

// При изменении выбранного компонента обновляем информацию RefreshSelection();

}

protected override void OnPaint(PaintEventArgs e) (

// Просто рисуем созданные строки int line = 5;

foreach (string s in drawLines) (

e.Graphics.DrawString(s,

new Font(FontFamily.GenericMonospace, 9), new SolidBrush(Color.Blue), 5, line); line +- 10;

}

}

}

}

Рис. 7.2. Использование сервиса IReferenceService

Еще одно замечание. Для получения списка всех компонентов (наиболее часто возникающая задача ДЛЯ сервиса IReferenceService) Правильно ПОЛучатЬ СПИСОК С ПОМОЩЬЮ вызова GetReferences (typeof (IComponent) ), Т. К. ВЫЗОВ ЭТОГО метода без параметров возвращает не только все компоненты, но и все объекты дизайнеров.

Сервис iNameCreationService позволяет создать имя компонента и проверить имя на правильность. Сервис имеет всего три метода:

?          метод string CreateName(IContainer container, Type dataType) создает уникальное в рамках контейнера имя компонента;

?          методы bool IsValidName (string пате) И void ValidateName (string name) позволяют проверить корректность имени (листинг 7.8).

Отличие двух последних методов в том, что первый просто возвращает false, если имя некорректно, а второй генерирует исключение, позволяющее получить дополнительную информацию об ошибке

Листинг 7 8 Пример реализации метода Vfili’i*LeName

public void ValidateName(string name) {

// Проверяем каждый символ строки

for (int i = 0; i < name.Length; i++) {

UnicodeCategory uc = Char.GetUnicodeCategory(name[i]);

switch (uc) {

case UnicodeCategory.UppercaseLetter: case UnicodeCategory.LowercaseLetter: case UnicodeCategory.TitlecaseLetter: case UnicodeCategory.DecimalDigitNumber:

break; default:

throw new Exception(string.Format{

"Символ {0} в имени ‘{1}’ не корректен.", i, name)};

}

}

Литература:

Агуров П. В. C#. Разработка компонентов в MS Visual Studio 2005/2008. – СПб.: БХВ-Петербург, 2008. — 480 е.: ил.

По теме:

  • Комментарии