Как вызвать событие вручную в C #? - PullRequest
8 голосов
/ 01 октября 2010

У меня есть USerControl, в котором у меня есть текстовое поле.Я использую usercontrol в своей форме, я хочу сделать что-то, когда кто-то нажимает ввод в текстовом поле.как мне это сделать?если вы скажете мне, как вызвать событие вручную, я могу вызвать usercontrol.keydown в textbox.keydown.

Ответы [ 5 ]

12 голосов
/ 01 октября 2010

Во-первых, события могут быть вызваны только из кода в элементе управления, который объявляет событие.Итак, ваш пользовательский элемент управления должен объявить пользовательское событие KeyDown, чтобы вызвать его.Например, вы не можете поднять KeyDown для TextBox, содержащегося в вашем пользовательском элементе управления.Однако вы можете объявить свой собственный KeyDown и присоединить к KeyDown TextBox обработчик, который будет вызывать ваш собственный KeyDown.

С учетом этого ограничения вызывать событие легко:

public delegate void MyEventHandler(object sender, MyEventArgs e)

public event MyEventHandler MyEvent;

public void RaisesMyEvent()
{
   ...

   if(MyEvent != null) //required in C# to ensure a handler is attached
      MyEvent(this, new MyEventArgs(/*any info you want handlers to have*/));
}

Повышениесобытие очень похоже на метод, потому что по сути это то, что вы делаете;Вы вызываете один или несколько делегатов метода, которые назначены делегату MultiCast за кулисами вашего мероприятия.Думайте об этом как о назначении метода обычному именованному делегату (например, если вы опустите ключевое слово «событие» в определении) и вызове его изнутри вашего кода.единственное различие между истинным событием и тем, что к событию может быть подключено более одного делегата-обработчика, и он будет вызывать их все при возникновении.

3 голосов
/ 13 октября 2010

Я искал ответ на этот вопрос для меня,

просто сделай это

examble:

//this is the call to trigger the event:

 **lst_ListaDirectorios_SelectedIndexChanged(this, new EventArgs());**

//do that if you have the method signature in the same class as I do. (something like this below)
private void lst_ListaDirectorios_SelectedIndexChanged(object sender, EventArgs e)
        {
          //do something
         }

Надеюсь, это было полезно для вас.

1 голос
/ 01 октября 2010

Как правило, вызов события заключен в метод с именем что-то вроде «On [EventName]», который проверяет, что у delgate есть одна или несколько целей (событие не является нулевым), а затем вызывает его с отправителем и любыми применимыми аргументами. ... что-то вроде этого является типичным шаблоном:

public event EventHandler SomethingHappened;
protected void OnSomethingHappend(EventArgs e)
{
    if (SomethingHappened != null)
        SomethingHappened(this, e);
}

Все, что должно вызвать это событие, вызывает этот метод (при условии, что он доступен).

Если вы просто хотите передать событие, тогда как UserControl, вы, вероятно, можете просто вызвать базовый метод «On [Event]», который, вероятно, выставлен. Вы также можете подключить обработчики событий, чтобы напрямую передавать событие из дочернего элемента в качестве события родительского элемента управления ... так что txtFoo.KeyPress просто вызывает метод OnKeyPress родительского элемента управления.

0 голосов
/ 01 октября 2010

Если вы используете WPF, вы можете использовать RaiseEvent: http://msdn.microsoft.com/en-us/library/system.windows.uielement.raiseevent.aspx

Но это неправильно для того, что вы хотите сделать.

Вам следует всплыть событие.

class MyControl : UserControl {
    public KeyDownEventHandler KeyDown;

    private void OnTextBoxKeyDown(object sender, EventArgs e){ KeyDown.Invoke(sender, e); }
}

Затем прослушайте KeyDown из вашей формы.Пожалуйста, извините за ошибки в наименовании различных элементов / событий.

0 голосов
/ 01 октября 2010

То, что вы описываете, называется пузырением событий. Вот пример:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyUserControl.ascx.cs" Inherits="MyUserControl" %>

<asp:TextBox ID="TextBox1" runat="server" OnTextChanged="TextBox1_TextChanged" />

public partial class MyUserControl : UserControl
{
 public event EventHandler UserControlTextBoxChanged;

 protected void TextBox1_TextChanged(object sender, EventArgs e) {
  if (UserControlTextBoxChanged != null)
   UserControlTextBoxChanged(sender, e);
 }
}

<%@ Page Language="C#" AutoEventWireup="True" Inherits="Default" CodeBehind="Default.aspx.cs" %>
<%@ Register Src="~/MyUserControl.ascx" TagName="MyUserControl" TagPrefix="uc1" %>

<uc1:MyUserControl ID="ucMyUserControl" runat="server" OnUserControlTextBoxChanged="ucMyUserControl_UserControlTextBoxChanged" />

public partial class MyPage : Page {
 protected void ucMyUserControl_UserControlTextBoxChanged(object sender, EventArgs e) {
  // sender is ucMyUserControl.TextBox1
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...