Как вызвать событие кнопки для динамической кнопки? - PullRequest
0 голосов
/ 02 мая 2019

У меня есть игра тральщика. Есть доска динамически созданных кнопок. Что я хочу сделать, это открыть всю доску (в основном, чтобы выполнить событие нажатия для каждой кнопки).

Я пытался использовать метод PerformClick, но он не работал. Во-первых, я использовал btn.Click событие как btn.Click += new EventHandler(btn_Click), но недавно я изменил его на btn.MouseUp событие из-за использования левого / правого щелчка. Даже когда я использовал событие btn.Click, PerformClick не работал.


        public Form1()
        {
            InitializeComponent();

            GenerateMineSweeper();

            // my try of using PerfomClick
            for (int i = 0; i < this.Controls.Count; ++i)
            {
                if (this.Controls[i] is Button)
                {
                    Button btn = (Button)this.Controls[i];
                    btn.PerformClick();
                }
            }
        }

        private void GenerateMineSweeper()
        {
            // board is 15 x 25
            Point p = new Point(0, 0);
            for (int i = 1; i <= 15; ++i)
            {
                for (int j = 1; j <= 25; ++j)
                {
                    Button btn = new Button();

                    btn.Location = p;
                    btn.Size = new Size(25, 25);
                    btn.BackColor = Color.RoyalBlue;
                    btn.FlatStyle = FlatStyle.Popup;

                    // btn.Click += new EventHandler(btn_Click);
                    btn.MouseUp += (s, e) =>
                    {
                        switch (e.Button)
                        {
                            case MouseButtons.Left:
                                btn_LeftClick(s, e);
                                break;
                            case MouseButtons.Right:
                                btn_RightClick(s, e);
                                break;
                        }
                    };

                    this.Controls.Add(btn);

                    p.X += 25;
                }
                p.Y += 25;
                p.X = 0;
            }
        }

        private void btn_LeftClick(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            // code
        }

        private void btn_RightClick(object sender, EventArgs e)
        {
            // code
        }

P.S. : Поскольку я использую событие MouseUp, я, очевидно, хочу триггер события LeftClick, а не RightClick.

РЕДАКТИРОВАТЬ: Я также попытался сделать это следующим образом:

for (int i = 0; i < this.Controls.Count; ++i)
{
    if (this.Controls[i] is Button)
    {
        Button btn = (Button)this.Controls[i];
        btn.MouseUp += btn_LeftClick;
    }
}

но я получил StackOverflowException ( Произошло необработанное исключение типа 'System.StackOverflowException' в mscorlib.dll ).

1 Ответ

1 голос
/ 02 мая 2019

Вот пример кода, который должен дать вам представление о каждой вещи, которую вы пытаетесь сделать

private void Form1_Load(object sender, EventArgs e)
{
    for (int i = 0; i < 5; i++)
    {
        //Let's put 5 buttons on the form
        Button btn = new Button();
        btn.Location = new Point(10, i * 25);
        if (i == 2)
        {
            btn.Name = "Bomb";
        }
        else
        {
            btn.Name = "btn" + i;
        }
        btn.Text = "Closed";
        //Add a Click EventHandler
        btn.Click += new EventHandler(btn_Click);
        //Add a MouseUp MouseEventHandler
        btn.MouseUp += new MouseEventHandler(btn_MouseUp);
        //Add them to the form
        Controls.Add(btn);
    }
}

private void btn_MouseUp(object sender, MouseEventArgs e)
{
    Button b = sender as Button;
    //Show me which button was used when this event was triggered
    //MessageBox.Show(e.Button.ToString() + " Mouse button was used.");

    //Since the Right button on mouseup will not be considered a Click, we can tell it to PerformClick
    if (e.Button == MouseButtons.Right)
    {
        b.PerformClick();
    }
}
private void btn_Click(object sender, EventArgs e)
{
    Button btn = sender as Button;
    if (btn.Name == "Bomb" && gameOver == false)
    {
        gameOver = true;
        btn.Text = "Boom";
        ExplodeAll(btn);
    }
    else
    {
        btn.Text = "Opened";
    }
}

bool gameOver = false;
private void ExplodeAll(Button sender)
{
    foreach (Button b in this.Controls.OfType<Button>())
    {
        if (b.Name.StartsWith("btn"))
        {
            b.PerformClick();
        }
    }
}

РЕДАКТИРОВАТЬ: Добавлен метод ExplodeAll, который открывает все кнопки при нажатии бомбы.Нажатие на 3-ю кнопку имитирует бомбу, открывающую все кнопки с .PerformClick()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...