У меня есть игра тральщика. Есть доска динамически созданных кнопок. Что я хочу сделать, это открыть всю доску (в основном, чтобы выполнить событие нажатия для каждой кнопки).
Я пытался использовать метод 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 ).