回发委托为空

时间:2013-05-23 23:56:05

标签: c# events postback custom-server-controls

我正在使用自定义事件构建服务器控件,例如使用此MSDN reference。但事件永远不会在回发时触发 - clickEventDelegate始终为null:

      if (clickEventDelegate != null)
      {
            clickEventDelegate(this, e);
      }

以下是我添加委托的方式:

     if (!Page.IsPostBack)
     {
          .....
         MYCONTROL.LeftClick+= FUNCTION;
     }

有什么想法吗?

2 个答案:

答案 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控件或您声明的自定义控件上的工作方式相同。