C# 回发委托为空

C# 回发委托为空,c#,events,postback,custom-server-controls,C#,Events,Postback,Custom Server Controls,我正在使用自定义事件构建服务器控件,并以此为例。但当回发-clickEventDelegate始终为空时,不会触发事件: if (clickEventDelegate != null) { clickEventDelegate(this, e); } 下面是我添加委托的方式: if (!Page.IsPostBack) { ..... MYCONTROL.LeftClick+=

我正在使用自定义事件构建服务器控件,并以此为例。但当回发-clickEventDelegate始终为空时,不会触发事件:

      if (clickEventDelegate != null)
      {
            clickEventDelegate(this, e);
      }
下面是我添加委托的方式:

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

有什么想法吗?

您没有发布足够的代码来找出事件为空的原因。但我会列出标准的模式

以下是如何为自定义事件定义参数类:

public class MyEventArgs : EventArgs
{
    private string MyField { get; private set; }

    public MyEventArgs(string myField)
    {
        MyField = myField;
    }
}
public event EventHandler<MyEventArgs> MyEvent;
以下是定义自定义事件的方式:

public class MyEventArgs : EventArgs
{
    private string MyField { get; private set; }

    public MyEventArgs(string myField)
    {
        MyField = myField;
    }
}
public event EventHandler<MyEventArgs> MyEvent;
这是您对派生类中事件的反应:

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.
};

另一个答案只是解释了事件是如何工作的,但完全忽略了问题的要点:在回发过程中委托为空

答案很简单。即使在回发期间,也只需每次订阅事件,因此如果(!Page.IsPostBack)

我知道这是一个非常古老的问题,你不可能还在寻找答案。但是当我阅读时


您没有发布足够的代码来找出事件失败的原因 空的

从前面的答案来看,我不能让这种错误的陈述变成这样

编辑:

为了添加更多解释,每次服务器返回要在浏览器中呈现的最终页面时,它都会释放此特定连接的状态。想象一下,如果服务器应该在内存中保留所有与其关联状态的连接,那么您每天可能有数千个用户,以及何时“清理”此内存

因此不,这是不可行的,这就是为什么他们创建了
ViewState
,以便浏览器可以将以前的信息发送到服务器。但是,此ViewState可以保存某些变量或对象的值,但不保存事件与其委托之间的绑定

回到具体的例子。如果你这样做

<asp:Button runat="server" ID="ButtonTest" OnClick="buttonTest_Click" 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请求(回发)时初始化所有内容


这与您的问题的示例代码完全相同,因此您可以看到,事件在本机ASP.NET控件或您声明的自定义控件上的工作方式相同。

我确认,subscribe每次回发都可以工作。但为什么它是这样工作的,以及像点击这样的默认事件应该在回发时订阅还是不订阅呢?
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        ButtonTest.Click += ButtonTest_Click;
    }
}