单击按钮arrays上的事件

如何获取最后一次单击面板上对象的名称? 诀窍是面板上有一大堆按钮(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; } 

正如@AVD评论你可以获得发送发送者对象的postback的按钮,你也可以使用按钮对象的CommandNameCommandArgument属性(它们通常在按钮位于GridDataList等中时使用,但你可以使用它们在这种情况下,如果你需要):

  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: 
Command Name: " + current.CommandName + "
Args: " + current.CommandArgument + "
Button Unique ID: " + current.UniqueID + "
Client ID: " + current.ClientID; }

页:

    

此代码生成类似于:

在此处输入图像描述

作为补充说明,Microsoft建议在PreInit事件中创建动态控件,或者在Init事件中使用母版页时创建动态控件

资源

编辑

  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(); } 

这产生了:

在此处输入图像描述

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

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

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

我刚刚通过重新定义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; } } 

感谢大家!