嵌套UserControls中的LinkBut​​ton不触发Command事件

时间:2009-05-13 08:29:54

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

我有一个嵌套的UserControl(这个控件是由另一个UserControl加载的动态加载,由一个主页面内的aspx页面动态加载)我想在其中使用LinkButton以及OnCommand事件。

此按钮必须添加到某个面板,因此我连接到面板的OnLoad事件(需要在生命周期中触发事件之前创建):

protected void PatentAssignee_Load(object sender, EventArgs e) {
    Label label = (Label)sender;

    LinkButton link = new LinkButton();
    link.Text = name;
    link.Command += Link_OnCommand;
    link.CommandArgument = "argument";
    link.ID = "someID";

    label.Controls.Add(link)
}

protected void Link_OnCommand(object sender, CommandEventArgs e) {
    Response.Write(e.CommandArgument);
}

但我无法调用Link_OnCommand方法。还有一件事我和这个问题有关:UserControl在UpdatePanel里面。我还试图让链接触发一个完整的回发:

ScriptManager s = (ScriptManager)this.Page.Master.FindControl("__scriptManager");
s.RegisterPostBackControl(link);

...但它没有太大变化,页面完全重新加载但没有触发事件。

编辑:根据评论中的要求,以下是有关嵌套的更多详细信息:

MasterPage
  PlaceHolder
    Page
      UpdatePanel
        UserControl1
          FormView
            PlaceHolder
              UserControl2
                LinkButton

这意味着UserControl2是动态加载的。

3 个答案:

答案 0 :(得分:2)

层次结构中的一个控件缺少ID。设置ID,事件将触发。这也会导致AjaxControlToolkit的破坏(确保每个扩展程序都有ID或客户端行为通常无法加载)。

答案 1 :(得分:0)

我记得也有这个问题。我没有找到真正的问题,但我所做的是,在aspx标记中连接了事件处理程序并且它有效。

您也可以尝试在页面生命周期的某个早期阶段挂钩事件处理程序。

尝试使用PreInit事件处理程序。

有关页面生命周期here的更多信息。

答案 2 :(得分:0)

对于ajax,我认为你可以创建一个可重用的类

public void registerUCAsyncPostBack(Page page, WebControl webcontrol, UserControl usercontrol){
            Control ControlAjaxNew = null;
            if (webcontrol.GetType() == typeof(LinkButton))
            {
                ControlAjaxNew = (LinkButton)usercontrol.FindControl(webcontrol.ID);
            }
            ScriptManager.GetCurrent(page).RegisterAsyncPostBackControl(ControlAjaxNew);
        }