none
动态生成的LinkButton单击时调用一个事件,并为事件传递个参数,让事件可以根据参数来执行相应操作。如何解决? RRS feed

  • 问题

  • <head>
       <script language="C#" runat="server">
          void LinkButton_Command(Object sender, CommandEventArgs e)
          {
             Label1.Text = "You chose: " + e.CommandName + " Item " + e.CommandArgument;
          }
       </script>
    </head>

       <form runat=server>
          <asp:LinkButton id="LinkButton1"
               Text="Order Item 10001"
               CommandName="Order"
               CommandArgument="10001"
               OnCommand="LinkButton_Command"
               runat="server"/>
          <asp:LinkButton id="LinkButton2"
               Text="Order Item 10002"
               CommandName="Order"
               CommandArgument="10002"
               OnCommand="LinkButton_Command"
               Runat="server"/>
          <asp:Label id="Label1" runat="server"/>

    以上代码实现了单击两个LinkButton,都调用LinkButton_Command事件,并利用CommandArgument属性来传递参数。

    现在想把代码改到代码页里,比如在前台添加label1,后台Page_load中动态添加LinkButton1、LinkButton2,最后实现单击两个linkbutton,调用函数下面的函数LinkButton_Command,但是在代码页里“linkbutton1.OnCommand"编译不了,提示错误:OnCommand不可访问,是受保护级别限。如何解决?

     public void LinkButton_Command(Object sender, CommandEventArgs e)
          {
             Label1.Text = "You chose: " + e.CommandName + " Item " + e.CommandArgument;
          }

     

    2010年8月12日 2:40

答案

  • 这个问题可以利用委托来解决

    <asp:LinkButton ID="LinkButton1" runat="server" CommandName="first" OnClick="LinkButton1 _Click" >首页</asp:LinkButton>
    <asp:LinkButton ID="LinkButton2" runat="server" CommandName="prev" OnClick="LinkButton2_Click" >上一页</asp:LinkButton>

     

    后台代码:

     protected void LinkButton1 _Click(object sender, EventArgs e)
        {
            this.LinkButton1.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
        }
        protected void LinkButton2_Click(object sender, EventArgs e)
        {
            this.LinkButton2.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
        }

     

    Page_OnClick方法如下:

        private void Page_OnClick(object sender, CommandEventArgs e)
        {
           
            string cmd = e.CommandName;
            switch (cmd)
            {
                case "first": //这里的first就是LinkButton1的CommandName属性
                   //code.....
                    break;
                case "prev":
                    //code.....
                    break;
               
                default:
                    break;
            }
         
          
        }

    和你的问题不同是,处理的事件并不是LinkButton_Command事件,而是利用事件委托都转向同一个方法Page_OnClick进行处理。你可以看一下,也许可以在其中找到你想要得到的东西

     

    针对此类问题,我自己用button与linkbutton做了个测试

     <asp:Button ID="Button1" runat="server" CommandName="bt1" OnCommand="Button_Command" Text="Button1" />
            <asp:Button ID="Button2" runat="server"  Text="Button2" CommandName="bt2" OnCommand="Button_Command" />
            <asp:LinkButton ID="LinkButton1" runat="server" OnCommand="LinkButton_Command" CommandArgument="lb1">LinkButton1</asp:LinkButton>
            <asp:LinkButton ID="LinkButton2" runat="server" OnCommand="LinkButton_Command" CommandArgument="lb2">LinkButton2</asp:LinkButton>

     

     

        protected void Button_Command(object sender, CommandEventArgs e)
        {
            if (e.CommandName == "bt1")
                Response.Write("你单击了第一个Button");
            else
                Response.Write("你单击了第二个Button");
        }


        protected void LinkButton_Command(object sender, CommandEventArgs e)
        {
            if(e.CommandArgument=="lb1")
                Response.Write("你单击了第一个LinkButton");
            else
                Response.Write("你单击了第二个LinkButton");
        }

     

    2010年8月14日 14:22

全部回复

  • 这个问题可以利用委托来解决

    <asp:LinkButton ID="LinkButton1" runat="server" CommandName="first" OnClick="LinkButton1 _Click" >首页</asp:LinkButton>
    <asp:LinkButton ID="LinkButton2" runat="server" CommandName="prev" OnClick="LinkButton2_Click" >上一页</asp:LinkButton>

     

    后台代码:

     protected void LinkButton1 _Click(object sender, EventArgs e)
        {
            this.LinkButton1.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
        }
        protected void LinkButton2_Click(object sender, EventArgs e)
        {
            this.LinkButton2.Command += new System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);
        }

     

    Page_OnClick方法如下:

        private void Page_OnClick(object sender, CommandEventArgs e)
        {
           
            string cmd = e.CommandName;
            switch (cmd)
            {
                case "first": //这里的first就是LinkButton1的CommandName属性
                   //code.....
                    break;
                case "prev":
                    //code.....
                    break;
               
                default:
                    break;
            }
         
          
        }

    和你的问题不同是,处理的事件并不是LinkButton_Command事件,而是利用事件委托都转向同一个方法Page_OnClick进行处理。你可以看一下,也许可以在其中找到你想要得到的东西

     

    针对此类问题,我自己用button与linkbutton做了个测试

     <asp:Button ID="Button1" runat="server" CommandName="bt1" OnCommand="Button_Command" Text="Button1" />
            <asp:Button ID="Button2" runat="server"  Text="Button2" CommandName="bt2" OnCommand="Button_Command" />
            <asp:LinkButton ID="LinkButton1" runat="server" OnCommand="LinkButton_Command" CommandArgument="lb1">LinkButton1</asp:LinkButton>
            <asp:LinkButton ID="LinkButton2" runat="server" OnCommand="LinkButton_Command" CommandArgument="lb2">LinkButton2</asp:LinkButton>

     

     

        protected void Button_Command(object sender, CommandEventArgs e)
        {
            if (e.CommandName == "bt1")
                Response.Write("你单击了第一个Button");
            else
                Response.Write("你单击了第二个Button");
        }


        protected void LinkButton_Command(object sender, CommandEventArgs e)
        {
            if(e.CommandArgument=="lb1")
                Response.Write("你单击了第一个LinkButton");
            else
                Response.Write("你单击了第二个LinkButton");
        }

     

    2010年8月14日 14:22
  • 谢谢!你的回答没有解决我的动态生成linkbutton控件的问题,动态生成linkbutton,就不可能设置LinkButton2_Click这样的事件!

    我找到了解决方法,代码相对简单些,不用再去判断单击了那个按钮,代码如下:

    protected void Page_Load(object sender, EventArgs e)
        {
            LinkButton lbtn3 = new LinkButton();  //动态生成linkbutton
            lbtn3.ID = "3";
            LinkButton lbtn4 = new LinkButton();
            lbtn4.ID = "4";
            lbtn3.Text = "按钮一";
            lbtn4.Text = "按钮二";
            lbtn3.Click +=new EventHandler(btn ); //实现动态添加按钮单击事件与btn事件的绑定
            lbtn4 .Click +=new EventHandler(btn);
            this.Panel1.Controls.Add(lbtn3);
            this.Panel1.Controls.Add(lbtn4);   
        }

        public void btn(object sender, EventArgs e)
        {
            LinkButton b = (LinkButton)sender; 
            Label1.Text = b.ID;
        }

    这样linkbutton的所有属性都可以使用了!

    2010年8月15日 11:39
  • 谢谢!你的回答没有解决我的动态生成linkbutton控件的问题,动态生成linkbutton,就不可能设置LinkButton2_Click这样的事件!

    我找到了解决方法,代码相对简单些,不用再去判断单击了那个按钮,代码如下:

    protected void Page_Load(object sender, EventArgs e)
        {
            LinkButton lbtn3 = new LinkButton();  //动态生成linkbutton
            lbtn3.ID = "3";
            LinkButton lbtn4 = new LinkButton();
            lbtn4.ID = "4";
            lbtn3.Text = "按钮一";
            lbtn4.Text = "按钮二";
            lbtn3.Click +=new EventHandler(btn ); //实现动态添加按钮单击事件与btn事件的绑定
            lbtn4 .Click +=new EventHandler(btn);
            this.Panel1.Controls.Add(lbtn3);
            this.Panel1.Controls.Add(lbtn4);   
        }

        public void btn(object sender, EventArgs e)
        {
            LinkButton b = (LinkButton)sender; 
            Label1.Text = b.ID;
        }

    这样linkbutton的所有属性都可以使用了!


    呵呵,是啊,我可能没有完全理解你的问题,不过你最后得出的结论是正确的。
    2010年8月16日 0:34