我有一个嵌套的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
是动态加载的。
答案 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);
}