【问题标题】:EventHandler is null事件处理程序为空
【发布时间】:2010-11-27 11:37:10
【问题描述】:

我正在尝试从用户控件引发单击事件并在包含页面上处理它。我遇到的问题是,当我单击用户控件上的按钮“imgstep1”时,imgstep1_click 事件背后的代码会触发,但“btnHandler”事件始终为空。因此它不会调用父事件。

对此的任何帮助将不胜感激。

我的用户控制码是:

.ascx 代码:

<asp:ImageButton ImageUrl="./images/step1.gif" 
        ID="imgstep1" runat="server" 
         OnClick="imgstep1_Click"/>

.ascx.cs 代码:

    public delegate void OnImageButtonClick();
    public event OnImageButtonClick btnHandler;

    protected void imgstep1_Click(object sender, ImageClickEventArgs e)
    {
        if (btnHandler != null)
            btnHandler();
    }

.aspx页面代码:

protected void Page_Load(object sender, EventArgs e)
{
     ucStepHdr.btnHandler += new StepsHeader.OnImageButtonClick(ucStepHdr_btnHandler);
}

void ucStepHdr_btnHandler()
{
  Response.Write ('test');
}

【问题讨论】:

  • 这是整个代码,还是典型的“如果重新加载”类型的块中的“+= new ...”行?

标签: c# asp.net events user-controls raise


【解决方案1】:

它看起来应该可以工作...你可以在调试器中单步执行代码,并在 Page_Load 中设置 ucStepHdr.btnHandler 的值后立即查看它的值吗? (顺便说一句,传统上这些是在 init 中设置而不是在 load 中设置的,但这不是您的问题。)

【讨论】:

    【解决方案2】:

    代码看起来很简单,可以正常工作。 btnHandler 为空的唯一原因可能是没有调用 aspx 页面中的事件注册代码。

    有回帖吗?您确定每次页面加载时都添加事件???

    ucStepHdr.btnHandler += new StepsHeader.OnImageButtonClick(ucStepHdr_btnHandler);
    

    【讨论】:

    • 是的!这就是问题所在。我称它为(!IsPostBack)代码。一旦我把代码放在外面,它就开始工作了。谢谢大家的回答。
    【解决方案3】:

    如果您删除 OnClick="imgstep1_Click" 并将其放入您的 ascx.cs 中

    protected ImageButton imgstep1;
    
    protected override void OnInit(EventArgs e)
    {
        this.imgstep1.Click += new ImageClickEventHandler(imgstep1_Click);
    }
    

    这种连接您的活动的方法有效吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-29
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      相关资源
      最近更新 更多