Как вызвать событие вручную в C#?

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

5 ответов


во-первых, события могут быть вызваны только из кода в элементе управления, который объявляет событие. Таким образом, ваш пользовательский элемент управления должен объявить пользовательское событие KeyDown, чтобы поднять его. Например, нельзя вызвать KeyDown в текстовом поле, содержащемся в пользовательском элементе управления. Однако вы можете объявить свой собственный KeyDown и прикрепить обработчик к KeyDown текстового поля, который поднимет ваш собственный 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*/));
}

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


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

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

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
         }

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


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

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

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

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


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

<%@ 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
 }
}

Если вы используете 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 из своей формы. Пожалуйста, простите ошибки в названии различных элементов / событий.