我正在使用自定义事件构建服务器控件,例如使用此MSDN reference。但事件永远不会在回发时触发 - clickEventDelegate始终为null:
if (clickEventDelegate != null)
{
clickEventDelegate(this, e);
}
以下是我添加委托的方式:
if (!Page.IsPostBack)
{
.....
MYCONTROL.LeftClick+= FUNCTION;
}
有什么想法吗?
答案 0 :(得分:1)
您没有发布足够的代码来找出您的事件为空的原因。但我要列出标准模式。
这是为自定义事件定义参数类的方法:
public class MyEventArgs : EventArgs
{
private string MyField { get; private set; }
public MyEventArgs(string myField)
{
MyField = myField;
}
}
这是您定义自定义事件的方式:
public event EventHandler<MyEventArgs> MyEvent;
这是您在与事件相同的类中编写事件提升者的方式:
protected virtual void OnMyEvent(MyEventArgs e)
{
EventHandler<MyEventArgs> myEvent = MyEvent; // for thread safety
if (myEvent != null)
{
myEvent(this, e);
}
}
这是你在(或派生类)中定义的类中引发事件的方式:
OnMyEvent(new MyEventArgs("Test"));
这是您对派生类中的事件做出反应的方式:
protected override void OnMyEvent(MyEventArgs e)
{
// TODO: Here you react to your event.
base.OnMyEvent(e);
}
这是您在外国班级注册活动的方式:
otherClass.MyEvent += delegate(object sender, EventArgs e)
{
// TODO: Here you react to your event.
};
答案 1 :(得分:1)
另一个答案只是解释了事件是如何运作的,但完全忽略了问题的主要观点:在回发期间委托为空
答案很简单。即使在回发期间,也只需订阅您的活动,因此您只需删除条件if (!Page.IsPostBack)
MYCONTROL.LeftClick+= FUNCTION;
我知道这是一个非常古老的问题,你无法继续寻找答案。但是当我读到
时您没有发布足够的代码来了解您的活动原因 空
从上一个回答中我不能让这样的错误陈述。
修改强>
要添加更多说明,每次服务器返回要在浏览器中呈现的最终页面时,它都会丢失此特定连接的状态。想象一下,如果服务器应该将所有与其关联状态的连接保留在内存中,那么每天可能有数千个用户,以及何时清理&#34;这个记忆?
因此,他们创建ViewState
以便浏览器可以将以前的信息发送到服务器的原因是不可行的。但是,此ViewState可以保存某些变量或对象的值,但不保存事件及其委托之间的绑定。
回到具体的例子。如果你这样做
<asp:Button runat="server" ID="ButtonTest" OnClick="buttonTest_Click" Text="test" />
事件的订阅是由ASP.NET在生命周期的早期阶段内部进行的,然后才能到达页面Page_Load
。您可以阅读有关ASP.NET生命周期here
如果你像这样分配事件处理程序
<asp:Button runat="server" ID="ButtonTest" Text="test" />
并在您网页的服务器端:
protected void Page_Load(object sender, EventArgs e)
{
ButtonTest.Click += ButtonTest_Click;
}
除了订阅稍晚之后,它的工作原理会相同。
但是如果你在条件
中装饰它protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ButtonTest.Click += ButtonTest_Click;
}
}
由于尚未分配事件处理程序,因此无法正常工作。请记住,您的服务器忘记了此特定连接的状态,并且必须在每个HTTP POST请求(PostBack)上初始化所有内容。
这与您的问题的示例代码完全相同,因此您可以看到事件在本机ASP.NET控件或您声明的自定义控件上的工作方式相同。