2012-06-16 109 views
1

如何獲取最後單擊面板上的對象的名稱?訣竅是面板上有一大排按鈕(btn [1] ... btn [200])。如何檢查我是否點擊了按鈕b [180]或b [11],甚至是否在面板外(無按鈕)?此外,這些按鈕通過編碼在頁面加載時生成。 謝謝。 Anna編號: 謝謝!出現的另一個問題(這產生了一個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; 
     } 

回答

6

由於@AVD評論,你可以得到該按鈕發起回發鑄造發送對象,你也可以使用來自按鈕對象的CommandNameCommandArgument性能(當按鈕是Grid內,他們通常使用, 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" /> 

此代碼生成類似:

enter image description here

作爲附加的註釋,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(); 
    } 

這產生:

enter image description here

+0

非常感謝Jupanol。另一件事:我有一個與buttonHandler()相同的方法,它被命名爲HowManyClicked(),它在buttonHandler()中被調用。內部HowManyClicked()我想確定Button btn1 = Panel2.FindControl(x)作爲Button;其中x是例如buttonArray [2,3]。但我總是得到NULL。按鈕數組buttonArray在生成它的方法中沒有按名稱標識:PopulateControls? –

+0

爲什麼你不只是作爲參數傳遞給'HowManyClicked'按鈕'buttonHandler'就像這個'HowManyClicked(Button button)'和'buttonHandler {HowManyClicked(sender as Button)}' – Jupaol

+0

那麼,HowManyClicked()是指在每次點擊後計算/更新,總共/總共點擊了多少個按鈕。所以這就是爲什麼我沒有使用方法簽名的參數。這更多的是一般性查詢,不涉及按鈕。 –

2

我怎樣才能獲得對象的名稱最後點擊面板上的?

點擊處理程序的第一個參數返回控件/對象的引用引發了事件。

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

我只是剛剛重新定義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; 
      } 

     } 

謝謝大家!