2013-10-25 14 views
-1

我試圖動態地創建一個按鈕數組,我不能完全弄清楚我如何讓一個函數知道哪個按鈕實際上被按下..我試過這種方式,但它似乎並沒有工作。有任何想法嗎?按鈕陣列 - 哪一個被按下? c#

public void game_setup(int columns, int rows, int mines) 
    { 
     //game_destroy(); 

     //Set Window Size 
     this.Height = 50 + Options.y_ini + rows * (Options.size + Options.space); 
     this.Width = 20 + 2 * Options.x_ini + columns * (Options.size + Options.space); 

     //Setup the playing field 
     Button[,] field = new Button[columns,rows]; 

     for (int i = 0; i < columns; i++) 
     { 
      for (int j = 0; j < rows; j++) 
      { 
       field[i, j] = new Button(); 

       //Button Size 
       field[i, j].Width = Options.size; 
       field[i, j].Height = Options.size; 

       //Button Position 
       int x = Options.x_ini + i * (Options.size + Options.space); 
       int y = Options.y_ini + j * (Options.size + Options.space); 
       field[i, j].Location = new Point(x, y);     

       //Event Handler 
       int send_i = i; 
       int send_j = j; 
       field[i, j].Click += (sender, args) => 
       { 
        field_Click(send_i, send_j); 
       }; 

       //Add the Button to the GameBoard 
       Controls.Add(field[i, j]); 

      } 
     } 

     //Distribute the Mines 
     //... 
    } 

    public void field_Click(int x, int y) 
    { 
     MessageBox.Show("X:" + x + " Y:" + y); 
     field[1, 2].Text = "hi"; 

    } 

回答

3

更改您的事件處理程序以傳遞sender參數。這是對被點擊的按鈕的引用。

field[i, j].Click += (sender, args) => 
{ 
    field_Click(sender, send_i, send_j); 
}; 

public void field_Click(object sender, int x, int y) 
{ 
    Button btn = sender as Button; 
    MessageBox.Show(btn.Name + "X:" + x + " Y:" + y); 
    field[x, y].Text = "hi"; 

} 
+0

這聽起來像是我的問題的解決方案,是的。但我害怕我沒有太多的問題賴特.. 我需要能夠訪問此方法中的所有字段[x,y] s。有沒有辦法做到這一點? – Timme

+0

即我想知道我按下了哪個按鈕(字段[1,2]作爲示例) 然後執行一些操作將它與其他字段[]進行比較。 – Timme

+0

@Timme你需要使'field'變量成爲一個類變量。因爲那樣它就可以被類中的所有方法訪問。 – Kami

3
field[i, j].Tag = new Point(send_i, send_j); 
field[i, j].Click += (sender, args) => { 
    Button button = sender as Button;  
    Point p = (Point) button.Tag; 
    field_Click(p.X, p.Y); 
}; 

注意:關鍵是你可以訪問通過sender實際點擊Button,只需將其轉換爲Button,你可以做的點擊Button一切。

0
field[i, j].Name = i +j'; 
field[i, j].Click += (sender, args) => 
      { 
       field_Click(sender, send_i, send_j); 
      }; 



public void field_Click(object theButton, int x, int y) 
{ 
    var currentButton = (Button) sender; 

    if (currentButton.Name == YOUR CODE HERE IF YOU WANT TO CHECK SOMETHING) 
    { 
     MessageBox.Show("X:" + x + " Y:" + y); 
     field[1, 2].Text = "hi"; 
    } 
} 
0

你想要做的就是有X和Y,當點擊發生。你不需要做太多的事情。 首先使用非常標準的點擊事件。

然後替換此:

int send_i = i; 
int send_j = j; 
field[i, j].Click += (sender, args) => 
{ 
    field_Click(send_i, send_j); 
}; 

有了這個

field[i, j].Tag = i.ToString() + "|" + j.ToString(); 
field[i, j].Click += new EventHandler(field_Click); 

現在改變事件處理程序是以下

private void field_Click(object sender, EventArgs e) 
{ 
    string[] sSplitTag = ((Button)sender).Tag.ToString().Split('|'); 
    int i = Convert.ToInt32(sSplitTag[0]); 
    int j = Convert.ToInt32(sSplitTag[1]); 
} 

始終嘗試使用標籤來了解細節誰是你的控制者。這是這個屬性的作用......標記你控制,以便當你再次看到他時可以識別他。