事件处理程序为空。

9
我正在尝试从用户控件中触发点击事件并在包含页面上处理它。我遇到的问题是,当我在用户控件上单击按钮“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 ..."行在一个典型的"if reload"类型的块内? - Lasse V. Karlsen
3个回答

11

这段代码看起来足够简单,应该能够正确运行。btnHandler为空的唯一原因可能是aspx页面中的事件注册代码没有被调用。

是否有一个post back?您确定每次加载页面时都添加了事件吗?

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

是的!那就是问题所在。我在(!IsPostBack)代码中调用了它。一旦我把代码放到外面,它就开始工作了。 感谢大家的回答。 - jack

1
如果您删除 OnClick="imgstep1_Click" 并将其放入您的 ascx.cs 中。
protected ImageButton imgstep1;

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

这种事件绑定的方法可行吗?


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接