【问题标题】:Click events on Array of buttons按钮数组上的单击事件
【发布时间】:2012-06-16 07:37:43
【问题描述】:

如何获取面板上最后点击的对象的名称?诀窍是面板上有一大堆按钮(btn[1] ... btn [200])。如何检查我是否单击了按钮 b[180] 或 b[11] 甚至在面板之外(无按钮)?按钮也是在页面加载时通过编码生成的。 谢谢你。安娜

编辑: 谢谢!出现的另一个问题(这产生了一个 NULL 对象引用): 我有一个与 buttonHandler() 处于同一级别的方法,它被命名为 HowManyClicked(),它是从 buttonHandler() 中调用的。在 HowManyClicked() 我想将 Button btn1 = Panel2.FindControl(x) 识别为 Button;例如,其中 x 是 buttonArray[2,3]。但我总是得到NULL。 按钮数组 buttonArray 在生成它的方法后是否无法通过名称识别

        public void buttonHandler(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            //string tt = btn.ToolTip.ToString();
            btn.BackColor = Color.Red;
            statusL.Text = HowManyClicked().ToString();

        }

        public int HowManyClicked()
        {
            int sum=0;
            for (int a = 0; a < 10; a++)
                for (int b = 0; b < 14; b++)
                {
                    string x = "buttonArray[" + a + ", " + b + "]";
                    statusL.Text = x;
                    Button btn1 = Panel2.FindControl(x) as Button;
                    if (btn1.BackColor == Color.Red) sum += 1;

                }
            return sum;
        }

【问题讨论】:

    标签: c# asp.net visual-studio-2008


    【解决方案1】:

    正如@AVD 所评论的,您可以获取发起回发的按钮以投射发送者对象,您还可以使用按钮对象中的CommandNameCommandArgument 属性(它们通常在按钮位于@987654326 内时使用@、DataList 等,但如果需要,您可以在此上下文中使用它们):

        protected void Page_Init(object sender, EventArgs e)
        {
            var s = Enumerable.Range(1, 10);
            foreach (var item in s)
            {
                var b = new Button();
                b.Text = "My Button " + item.ToString();
                b.CommandName = "custom command";
                b.CommandArgument = item.ToString();
                b.Click += new EventHandler(b_Click);
                this.myPanel.Controls.Add(b);
            }
        }
    
        void b_Click(object sender, EventArgs e)
        {
            var current = sender as Button;
            this.lblMessage2.Text = "Clicked from array buttons: <br/>Command Name: " + current.CommandName + "<br/>Args: " + current.CommandArgument + "<br/>Button Unique ID: " + current.UniqueID + "<br/>Client ID: " + current.ClientID;
        }
    

    页面:

    <asp:Panel runat="server" ID="myPanel">
    </asp:Panel>
    
    <asp:Label ID="lblMessage2" runat="server" />
    

    此代码生成如下内容:

    作为附加说明,Microsoft 建议在 PreInit 事件中创建动态控件,或者如果您使用母版页,则在 Init 事件中创建动态控件

    source

    已编辑

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                this.ViewState["count"] = 0;
            }
    
        }
    
    
        protected void Page_Init(object sender, EventArgs e)
        {
            var s = Enumerable.Range(1, 10);
            foreach (var item in s)
            {
                var b = new Button();
                b.Text = "My Button " + item.ToString();
                b.Click += new EventHandler(buttonHandler);
                this.myPanel.Controls.Add(b);
            }
        }
    
        void buttonHandler(object sender, EventArgs e)
        {
            // update here your control
            var b = sender as Button;
            b.BackColor = Color.Red;
            HowManyClicked();
        }
    
        private void HowManyClicked()
        {
            var c = (int)this.ViewState["count"];
            c++;
            this.ViewState["count"] = c;
            this.lblMessage2.Text = "Clicked controls: " + this.ViewState["count"].ToString();
        }
    

    这产生了:

    【讨论】:

    • 非常感谢,Jupanol。另一件事:我有一个与 buttonHandler() 处于同一级别的方法,它被命名为 HowManyClicked(),它是从 buttonHandler() 中调用的。在 HowManyClicked() 我想将 Button btn1 = Panel2.FindControl(x) 识别为 Button;例如,其中 x 是 buttonArray[2,3]。但我总是得到NULL。按钮数组 buttonArray 在生成它的方法之后是否无法通过名称识别:PopulateControls??
    • 你为什么不把来自buttonHandler的按钮作为参数传递给HowManyClicked,就像HowManyClicked(Button button)buttonHandler{HowManyClicked(sender as Button)}一样
    • 好吧,HowManyClicked() 旨在计算/更新每次点击后,总共/整体点击了多少按钮。所以这就是为什么我没有为方法签名使用参数。这更像是一个一般性的查询,而不是指一个按钮。
    • 太好了,非常感谢 Jupanol!我只是想出了另一种方法: public int HowManyClicked() { int sum=0; foreach (Control cnt in this.Panel2.Controls) if (cnt is Button) { Button btn = (Button)cnt; if (btn.BackColor == Color.Red) sum += 1;} return sum; } }
    • 这也有效,只需重新定义 HowManyClicked() 但仍然不确定为什么我的第一个方法不起作用的解释是什么。
    【解决方案2】:

    如何获取面板上最后点击的对象的名称?

    点击处理程序的第一个参数返回控件/对象的引用已引发事件。

    public void buttonHandler(object sender, EventArgs e)
    {
       Button btn=sender as Button;
       ....
    }
    

    【讨论】:

      【解决方案3】:

      我刚刚通过重新定义 HowManyClicked() 找到了另一个解决方法,所以我在下面添加它。仍然不确定为什么第一种方法(我的问题中的那个)也不起作用。如下:

      public int HowManyClicked()
              {
                  int sum=0;
                  foreach (Control cnt in this.Panel2.Controls)
                      if (cnt is Button)
                      {
                          Button btn = (Button)cnt;
                          if (btn.BackColor == Color.Red)
                              sum += 1;
                      }
                  return sum;
                 }
      
              }
      

      谢谢大家!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-18
        • 1970-01-01
        • 1970-01-01
        • 2018-12-18
        相关资源
        最近更新 更多