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

0

производится с помощью сервиса

iEventBindingService. Вот его основные методы:

?         метод string             CreateUniqueMethodName (IComponent           component, EventDescriptor e} генерирует уникальное имя события;

?         метод ICollection GetCompatibleMethods {EventDescriptor e) возвращает коллекцию обработчиков событий, по сигнатуре совместимых с указанным;

?         метод EventDescriptor GetEvent (PropertyDescriptor property) возвращает дескриптор события по дескриптору свойства;

?         метод PropertyDescriptorCollection GetEventProperties(EventDescriptor- Coiiection events} конвертирует коллекцию дескрипторов событий в дескрипторы свойств;

?     метод PropertyDescriptor GetEventProperty(EventDescriptor e) возвращает дескриптор свойства по дескриптору события;

?     методы bool ShowCode(int lineNumber), bool ShowCode (IComponerit component, EventDescriptor e) И bool ShowCode () открывают редактор кода либо по указанному номеру строки, либо на описании указанного события, либо в текущем месте кода. Методы возвращают true, если удалось открыть редактор кода.

В качестве примера я приведу компонент EventBindingServiceControi, имеющий в контекстном меню специальную команду Создать testEvent, при выполнении которой создается обработчик события testEvent (листинг 7.9). В самом компоненте это событие не вызывается, но для данного примера это не важно. Для создания обработчика мы сначала получаем список всех событий компонента (переменная edc), затем находим дескриптор нужного нам обработчика и сохраняем его в переменной ed. Метод GetEventProperty о позволяет найти дескриптор свойства, соответствующего обработчику. После этого остается только получить уникальное имя для нового обработчика (метод createUniqueMethodName ()) и создать сам обработчик в коде, т. е. установить имя обработчика метода (метод SetvalueO). В конце метод ShowCode () переключает нас в редактор кода.

И еще несколько слов об уникальном имени обработчика события. При создании уникального имени используется следующий шаблон:

<имя компонента> <имя обработчика>[_<уникальный номер>]

В нашем примере, если обработчик еще не создан, будет сгенерировано имя eventControl l_t est Event. При повторном вызове имя обработчика будет иметь ВИД eventControll_testEvent_l. И т. Д.

Листинг 7 9 Программное создание обр.яботчика события

using System;

using System.Collections;

using System.ComponentModel;

using System.ComponentModel.Design;

using System.Drawing;

using System.Data;

using System.Windows.Forms;

using System. Windows. Forms. Design;

namespace EventBindingServiceTest (

(Designer(typeof(EventDesigner))]

public class EventBindingServiceControl : UserControl {

// Событие, для которого будем создавать обработчик. // В нашем компоненте оно никогда не вызывается, // но в данном случае это не существенно, public event System.EventHandler testEvent;

// Конструктор компонента

public EventBindingServiceControl()

{

this.BackColor = Color.White; this.Size = new Size(100, 100);

}

}

// Дизайнер компонента EventControl

public class EventDesigner : ControlDesigner

{

public EventDesigner()

{

}

// Обработчик команда меню "Создать testEvent"

private void ConnectEvent(object sender, EventArgs e) {

IEventBindingService eventservice =

{lEventBindingService)this.Component.Site.GetService( typeof(lEventBindingService));

if (eventservice != null) {

// Получаем коллекцию дескрипторов событий EventDescriptorCollection edc =

TypeDescriptor.GetEvents(this.Component); if (edc — null [! edc.Count — 0) return;

EventDescriptor ed = null;

// Ищем событие с именем "testEvent"

foreach (EventDescriptor edi in edc) {

if (edi.Name == "testEvent")

{

ed = edi;

break;

}

}

//He нашли — ошибка. Выходим, if <ed == null) return;

// Получаем дескриптор свойства

PropertyDescriptor pd = eventservice.GetEventProperty(ed); if (pd == null) return;

// Создаем уникальное имя для обработчика события string eventName =

eventservice.CreateUniqueMethodName{this.Component/ ed);

// Создаем обработчик события с указанным именем pd.SetValue(this.Component, eventName);

// Переключаемся в редактор кода на описание метода eventservice.ShowCode(this.Component, ed);

}

}

// Добавляем пункт в контекстное меню компонента public override DesignerVerbCollection Verbs

1

get {

DesignerVerbCollection dvc = new DesignerVerbCollection (); dvc.Add(new DesignerVerb("Создать testEvent",

new EventHandler{ConnectEvent}));

return dvc;

}

}

1

1

Литература:

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

По теме:

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