2

我正在 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
}

请提供帮助。

谢谢。

4

5 回答 5

3

您使用了错误的事件:

ClientClick 只是在 javascript 中触发的客户端事件。

你想要的是点击事件

[...]

lb.Click += new CommandEventHandler(lb_Command); //Create Handler for it.

如果您仍然没有捕捉到该事件,那么您很可能在页面生命周期中的错误时间动态声明了您的 LinkBut​​ton(正如 Eoin Campbell 在他的评论和他的回答中提到的那样)。

他链接到一篇关于该主题的非常好的文章,您应该阅读它以了解您为什么不了解该事件。

从您对问题和不同答案的评论来看,您是在 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
    }
}

上面链接的文章将解释为什么会这样。这是一个很难掌握但非常重要的概念。

于 2012-09-06T13:01:39.273 回答
2

您正在混合客户端和服务器端代码。OnClientClick 是附加客户端代码的方法。lb_Command 在服务器端运行。

请改用 Click。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.onclientclick.aspxhttp://msdn.microsoft.com/en-us/library/system.web。 ui.webcontrols.button.click.aspx

于 2012-09-06T13:00:32.750 回答
1

好的。两件事情。正如其他人指出的那样,您应该使用LinkButton CommandorClick处理程序。

但是您的第二个问题是您通过尝试仅生成控件来遇到页面生命周期问题

  1. 如果(!回发)
  2. Page_Load.

阅读:这是一篇非常好的文章,可以追溯到 .net 1 http://www.4guysfromrolla.com/articles/092904-1.aspx

简而言之,您应该每次都创建控件(不仅仅是在初始帖子中),并且您需要+=在页面生命周期中尽早连接事件处理程序(该部分),以便在时间之前连接事件PageLifeCycle 尝试触发它们。

覆盖页面的OnInit方法并将您的代码移动到那里,无需if(!Postback)检查

于 2012-09-06T13:24:26.730 回答
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) + "&nbsp;"; //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             
    }

谢谢。

于 2012-09-06T13:16:56.997 回答
-1

如果链接按钮是从 Button 类继承的,那么您应该附加到 OnClick 事件。?

http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.buttonbase.click(v=vs.100 )

或者

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onclick.aspx

于 2012-09-06T13:02:10.440 回答