簡體   English   中英

按鈕陣列 - 按下了哪一個? C#

[英]Button Array - which one is pressed? 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";

    }
 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進行所有操作。

更改事件處理程序以傳遞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";

}
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";
    }
}

您想要做的就是單擊時出現X和Y。 您不需要做很多事情。 首先使用非常標准的click事件。

然后替換這個:

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

始終嘗試使用標簽來了解有關您的控件的詳細信息。 這就是該屬性的用途。...給您添加標簽,以便您再次看到他時就可以識別出他。

你好,在同一個問題上也需要一些幫助,但不同的代碼這里是我的代碼,請一些將是最受歡迎的

public partial class GuichetDasBoard : UserControl
{
    List<Button> btnCat = new List<Button>();
    int i = 0;

    Connection con = new Connection();
    MySqlCommand cmd = new MySqlCommand();
    DataTable dt = new DataTable();
    MySqlDataReader dr;
    string Query = "SELECT * FROM  categorie_article";
    public GuichetDasBoard()
    {
        InitializeComponent();
        DataLoad();
    }      

    private void DataLoad()
    {
        try
        {
            Connection.dataSource();
            cmd.Connection = Connection.dataSource();
            cmd.CommandText = Query;
            dr = cmd.ExecuteReader();
            dt.Load(dr);
            List<String> stringArr = new List<String>();

            // Classic version :-)
            for (int a = 0; a < dt.Rows.Count; a++)
            {
                stringArr.Add(dt.Rows[a]["categorie"].ToString());
            }

            int curentx = 0;
            const int Step = 2;
            const int WIDTH = 85;
            const int HEIGHT = 85;
            bool IsButtonsOnScreen = false;

            for(i=0; i<stringArr.Count; i ++)
            {
                Button button = new Button();
                button.Content = stringArr[i];
                button.Uid=i.ToString();
                button.Width = WIDTH;
                button.Height = HEIGHT;
                button.Background = (SolidColorBrush)new BrushConverter().ConvertFromString("#FF940C0C");
                button.Foreground= (SolidColorBrush)new BrushConverter().ConvertFromString("#FFFFFFFF");
                button.BorderBrush = (SolidColorBrush)new BrushConverter().ConvertFromString("#FF940C0C");
                button.FontSize = 10;
                btnCat.Add(button);
            }

            if(!IsButtonsOnScreen)
            {
                foreach(var item in btnCat)
                {
                    Canvas.SetLeft(item, Step * curentx);
                    curentx += 45;
                    viewb.Items.Add(item);
                    
                }
                IsButtonsOnScreen = true;
            }

        }
        catch (Exception x)
        {
            MessageBox.Show(x.ToString());
        }
        finally
        {
            dr.Close();
            con.connClose();
        }
    }
  

   
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM