1

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

这个按钮必须添加到某个面板,所以我连接到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是动态加载的。

4

3 回答 3

2

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

于 2010-06-21T09:12:52.847 回答
0

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

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

试试 PreInit 事件处理程序。

有关页面生命周期的更多信息,请点击此处

于 2009-05-13T08:37:25.060 回答
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);
        }
于 2011-11-22T03:53:34.023 回答