Как предоставить настраиваемому элементу управления ASP.Net новое настраиваемое событие

Я чувствую, что это то, что Google должен решить за меня, но я почти не нахожу примеров, которые я действительно понимаю.

У меня есть этот настраиваемый элемент управления под названием UserControlTask. Я хочу добавить к нему событие OnHide и, как следует из названия, хочу, чтобы оно выдавалось, когда пользовательский элемент управления скрывается.

Кажется, я нахожу много примеров переопределения событий, таких как OnClick, но ни одного, где добавляется совершенно новое событие.

Все, что я действительно знаю, это то, что мне нужно объявить EventHandler ...

public event EventHandler Hide;

Затем я считаю, что добавить OnHide к атрибутам в моем методе CreateChildControls. В любом случае я думаю, что это так. Больше я ничего не знаю.

Ответов (4)

Решение

Ваша проблема не в добавлении события (что легко:

public event EventHandler Hide;

// this is the function that raises the event
private void OnHide() {
    if (Hide != null)
        Hide(this, new EventArgs());
}

Ваша проблема заключается в том, чтобы знать, когда звонить OnHide() (что вызывает событие) - поскольку нет способа узнать, когда пользователь скрывает элемент управления (я предполагаю, что вы говорите о чем-то, что происходит на стороне клиента), нет времени, в которое вы следует поднять это событие.

Возможно, вы путаете методы, вызывающие события, и сами события.

Control.OnClick - это метод, вызывающий Control.Click событие. В подклассах переопределение OnClick (и вызов base.OnClick) позволяет выполнять обработку без необходимости проходить через обработчик.

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

На самом деле две простые вещи.

Первое, что нужно сделать в настраиваемом элементе управления, - это объявить объект события:

public event System.EventHandler EmployeeSelected;

Затем в вашем коде, с помощью которого вы хотите инициировать событие, вы делаете следующее:

protected void btnSelectEmployee_Click(object sender, EventArgs e)
{        
    if (!string.IsNullOrEmpty(txtSearchEmployeeId.Text)) 
    {
       EmployeeSelected(this, new EventArgs());
    }       
}

Затем в основном вызывающем классе вы потребляете событие и обрабатываете его по мере необходимости.

Есть также некоторые дополнительные действия, которые вы можете сделать, если хотите также передавать аргументы события.

Примечание. Я добавил код из собственного приложения. Я подумал, что вам будет достаточно легко экстраполировать на собственное приложение.

Это просто дополнение к решению. Как решить эту проблему в VB. Добавьте в элемент управления следующее:

Delegate Sub OnCompleted()

Public Event Completed As OnCompleted

При необходимости поднимите событие в элементе управления

RaiseEvent Completed()

Затем на родительской странице вы можете выполнить это событие следующим образом

<asp:somecontrol OnCompleted="SomeControl_OnCompleted"...

который затем обрабатывается в коде следующим образом

Protected Sub SomeControl_OnCompleted() Handles SomeControl.Completed

easy peazy, просто убедитесь, что ваш обработчик событий такой же, как ваше объявление делегата.