我正在c#中生成动态链接按钮。单击其中任何一个按钮,将调用另一个函数来显示单击了哪个链接按钮。但是没有通过点击任何链接按钮进行调用。
这就是我如何产生它。
Int32 i; //create a integer variable
for (i = 1; i <= 10; i++) // will generate 10 LinkButton
{
LinkButton lb = new LinkButton(); //create instance of LinkButton
lb.Text = Convert.ToString(i) + ""; //LinkButton Text
lb.ID = Convert.ToString(i); // LinkButton ID’s
lb.CommandArgument = Convert.ToString(i); // LinkButton CommandArgument
lb.CommandName = Convert.ToString(i); // LinkButton CommanName
lb.OnClientClick+= new CommandEventHandler(lb_Command); //Create Handler for it.
//type lb.Command += and press double time Tab Key it will generat the lb_Command() code
PlaceHolder1.Controls.Add(lb); // Adding the LinkButton in PlaceHolder
}
这是功能代码。
void lb_Command(object sender, CommandEventArgs e)
{
Label1.Text = e.CommandName; // will display the which Linkbutton clicked
Label1.Text = "aaaa";
// Response.Redirect(“LnkBtn.aspx?val=” + Label1.Text); // you can also use as QueryString to send values to another page
}
请提供帮助。
感谢。
答案 0 :(得分:3)
您使用的是错误的事件:
ClientClick只是在javascript中触发的客户端事件。
你想要的是Click Event
[...]
lb.Click += new CommandEventHandler(lb_Command); //Create Handler for it.
如果你还没有捕捉到这个事件,那么你很有可能在页面生命周期的错误时间动态声明你的LinkButton(正如Eoin Campbell在他的评论和答案中所提到的那样)。
他链接到一个关于这个主题非常好的article,你应该阅读它以理解为什么你没有抓住这个事件。
根据您对问题的评论和不同的答案判断,您在Page_Load函数中声明了按钮。这不起作用,因为Page_Load在页面生命周期中发生得太晚了。
根据我的理解,现在你有:
void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostBack)
{
Int32 i; //create a integer variable
for (i = 1; i <= 10; i++) // will generate 10 LinkButton
{
LinkButton lb = new LinkButton(); //create instance of LinkButton
lb.Text = Convert.ToString(i) + ""; //LinkButton Text
lb.ID = Convert.ToString(i); // LinkButton ID’s
lb.CommandArgument = Convert.ToString(i); // LinkButton CommandArgument
lb.CommandName = Convert.ToString(i); // LinkButton CommanName
lb.OnClientClick+= new CommandEventHandler(lb_Command); //Create Handler for it.
PlaceHolder1.Controls.Add(lb); // Adding the LinkButton in PlaceHolder
}
}
}
你需要摆脱它。相反,使用:
void Page_Init(object sender, EventArgs e)
{
Int32 i; //create a integer variable
for (i = 1; i <= 10; i++) // will generate 10 LinkButton
{
LinkButton lb = new LinkButton(); //create instance of LinkButton
lb.Text = Convert.ToString(i) + ""; //LinkButton Text
lb.ID = Convert.ToString(i); // LinkButton ID’s
lb.CommandArgument = Convert.ToString(i); // LinkButton CommandArgument
lb.CommandName = Convert.ToString(i); // LinkButton CommanName
lb.OnClientClick+= new CommandEventHandler(lb_Command); //Create Handler for it.
PlaceHolder1.Controls.Add(lb); // Adding the LinkButton in PlaceHolder
}
}
上面链接的文章将解释为什么会这样。这是一个难以掌握的概念,但却是一个非常重要的概念。
答案 1 :(得分:2)
您正在混合客户端和服务器端代码。 OnClientClick是附加客户端代码的方法。 lb_Command在服务器端运行。
使用Click代替。
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.onclientclick.aspx 与 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.click.aspx
答案 2 :(得分:1)
确定。两件事情。正如其他人指出您应该使用LinkButton
Command
或Click
处理程序。
但您的第二个问题是,您尝试仅生成控件时遇到了Page Life Cycle问题
Page_Load
。阅读本文:这是一篇关于这个主题的非常好的文章,可以追溯到.net 1 http://www.4guysfromrolla.com/articles/092904-1.aspx
简而言之,您应该每次都创建控件(而不仅仅是在初始帖子上),并且您需要在页面生命周期中尽早连接事件处理程序(+=
部分),以便当PageLifeCycle尝试触发它们时,事件是有线的。
覆盖网页的OnInit
方法并将代码移到那里,而不进行if(!Postback)
检查
答案 3 :(得分:0)
而不是下面的代码
lb.OnClientClick+= new CommandEventHandler(lb_Command); //Create Handler for it.
使用以下
lb.Command+= new CommandEventHandler(lb_Command); //Create Handler for it.
这是完整的代码。它在我的最后运行。
protected void Page_Load(object sender, EventArgs e)
{
Int32 i; //create a integer variable
for (i = 1; i <= 10; i++) // will generate 10 LinkButton
{
LinkButton lb = new LinkButton(); //create instance of LinkButton
lb.Text = Convert.ToString(i) + " "; //LinkButton Text
lb.ID = Convert.ToString(i); // LinkButton ID’s
lb.CommandArgument = Convert.ToString(i); // LinkButton CommandArgument
lb.CommandName = Convert.ToString(i); // LinkButton CommanName
//lb.Click += lb_Click; //Create Handler for it.
lb.Command += lb_Command;
//type lb.Command += and press double time Tab Key it will generat the lb_Command() code
form1.Controls.Add(lb); // Adding the LinkButton in PlaceHolder
}
}
void lb_Command(object sender, CommandEventArgs e)
{
Label1.Text = e.CommandName; // will display the which Linkbutton clicked
}
感谢。
答案 4 :(得分:-1)