如何在C#中手动调用事件?

我有一个USerControll,我有一个文本框。 我在表单中使用usercontrol,当有人按下文本框上的enter时我想做某事。 我该怎么做? 如果你告诉我如何手动调用事件,我可以在textbox.keydown中调用usercontrol.keydown。

首先,只能从声明事件的控件中的代码引发事件。 因此,您的用户控件必须声明自定义事件KeyDown才能引发它。 例如,您不能在用户控件包含的TextBox上引发KeyDown。 但是,您可以声明自己的KeyDown,并将一个处理程序附加到TextBox的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*/)); } 

提升事件看起来很像一种方法,因为从本质上讲,这就是你正在做的事情; 您正在调用在事件幕后分配给MultiCast委托的一个或多个方法委托。 可以把它想象成为一个普通的命名委托分配一个方法(比如你从定义中省略了“event”关键字)并从你的代码中调用它。 true事件与事件之间的唯一区别是事件可以附加多个处理程序委托,并在引发时调用所有事件。

我正在寻找这个问题的答案,

就这样做

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]”的方法中,该方法validationdelgate是否具有一个或多个目标(事件不为空),然后使用发送方和任何适用的参数调用它…所以像这样的典型模式:

 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" %>  

 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" %>  

 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。 请原谅各种元素/事件的命名错误。