Asp.net 动态创建的链接按钮的OnClick事件不起作用
我试过几种解决这个问题的方法,但都不管用。 基本上,我有一个员工表,用户可以选择通过更新面板动态添加员工。每个员工都将被添加为链接按钮,此按钮将通过单击事件启动ajaxToolkit:ModalPopupXtender窗口,该窗口将显示员工详细信息。 问题是,当我单击员工姓名时,弹出窗口将显示,但详细信息不会显示 下面是我创建按钮并将其放入表中的代码:Asp.net 动态创建的链接按钮的OnClick事件不起作用,asp.net,ajax,onclick,modalpopupextender,linkbutton,Asp.net,Ajax,Onclick,Modalpopupextender,Linkbutton,我试过几种解决这个问题的方法,但都不管用。 基本上,我有一个员工表,用户可以选择通过更新面板动态添加员工。每个员工都将被添加为链接按钮,此按钮将通过单击事件启动ajaxToolkit:ModalPopupXtender窗口,该窗口将显示员工详细信息。 问题是,当我单击员工姓名时,弹出窗口将显示,但详细信息不会显示 下面是我创建按钮并将其放入表中的代码: LinkButton lbtn = new LinkButton(); lbtn.ID = employ
LinkButton lbtn = new LinkButton();
lbtn.ID = employee_arry[i] + "_lbtn" + i;
lbtn.Text = employee_arry[i];
lbtn.Click += new EventHandler(this.employee_info);
lbtn.CausesValidation = false;
lbtn.Attributes.Add("runat", "server");
cell.Controls.Add(lbtn);
以下是员工信息方法:
//the info will be pulled from the database…
public void employee_info(object sender, EventArgs e)
{
name.Text = "employee name";
dept.Text = "employee department";
jobt.Text = "employee job title";
email.Text = "employee email";
tel.Text = "employee telephone";
ModalPopupExtender1.Show();
}
检查这个答案
这解释了动态控件的行为
您需要考虑:
- 不使用母版页时,应在PreInit事件中创建动态控件,如果是,则在Init事件中创建控件
- 避免在这些事件中设置可以在每个post中更改的属性,因为当应用视图状态(在post事件中)时,这些属性将被覆盖
- 每次发布页面时都必须创建动态控件,如果(!this.IsPostBack)this.CreatemyDynamicControls(),请避免此操作李>
- 在PreInit或Init事件中创建控件时,它们的状态将在post事件中自动设置,这意味着在LoadComplete事件中,控件将包含它们的状态,即使在每次post中再次创建控件时,甚至在没有显式设置其状态时。注意:当您处理在设计时创建的控件时,此行为是不同的,在这种情况下,设置状态的事件是加载事件
- 事件订阅应在PageLoadComplete之前发生,否则不会引发事件订阅
代码隐藏
受保护的int NumberOfControl
{
得到
{
如果(ViewState[“c”]==null)
{
返回0;
}
返回int.Parse(ViewState[“c”].ToString());
}
设置
{
ViewState[“c”]=值;
}
}
受保护的void addControl\u单击(对象发送方,事件参数e)
{
这个.NumberOfControls++;
this.myPanel.Controls.Add(新文本{Text=“
”});
添加(this.CreateLinkButton(this.NumberOfControls));
}
受保护的无效页面\u预加载(对象发送方,事件参数e)
{
this.createDynamicClinkButtons();
}
私有void CreateDynamicClinkButtons()
{
for(int i=0;i ”});
this.myPanel.Controls.Add(this.CreateLinkButton(i+1));
}
}
私有链接按钮CreateLinkButton(内部索引)
{
var l=newlinkbutton{Text=“MyLink”+index.ToString(),ID=“myLinkID”+index.ToString()};
l、 单击+=(x,y)=>
{
this.lblMessage.Text+=“
ID:”+(x作为链接按钮).ID;
};
返回l;
}
输出
所有控件都在更新面板中吗?是的,我将表格放在aspx页面中,表格后面的代码是动态填充的……您已经能够解决它了吗?我认为您的代码是正确的,但您需要知道哪个控件是发送方。。。。您需要像这样的东西,LinkButton objButton=(LinkButton)sender;name.text=objButton.text,嗯,它仍然模糊不清^ ^ ^ ^ ^据我所知,在页面_LoadComplete中,我应该这样写:linkbtn..Click+=neweventhandler(方法_name);没有任何声明,这是正确的吗??如果是,那么我如何知道按钮ID?因为它是动态创建的。
<asp:ScriptManager runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server" ViewStateMode="Enabled">
<ContentTemplate>
<asp:Panel runat="server" ID="myPanel">
</asp:Panel><br />
<asp:Button ID="Button1" Text="add control" runat="server" OnClick="addControl_Click" /><br />
<asp:Label ID="lblMessage" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
protected int NumberOfControls
{
get
{
if (ViewState["c"] == null)
{
return 0;
}
return int.Parse(ViewState["c"].ToString());
}
set
{
ViewState["c"] = value;
}
}
protected void addControl_Click(object sender, EventArgs e)
{
this.NumberOfControls++;
this.myPanel.Controls.Add(new Literal { Text = "<br />" });
this.myPanel.Controls.Add(this.CreateLinkButton(this.NumberOfControls));
}
protected void Page_PreLoad(object sender, EventArgs e)
{
this.CreateDynamicLinkButtons();
}
private void CreateDynamicLinkButtons()
{
for (int i = 0; i < this.NumberOfControls; i++)
{
this.myPanel.Controls.Add(new Literal { Text = "<br />" });
this.myPanel.Controls.Add(this.CreateLinkButton(i + 1));
}
}
private LinkButton CreateLinkButton(int index)
{
var l = new LinkButton { Text = "MyLink" + index.ToString(), ID = "myLinkID" + index.ToString() };
l.Click += (x, y) =>
{
this.lblMessage.Text += "<br/>ID: " + (x as LinkButton).ID;
};
return l;
}