Я бы избегал, чтобы класс обрабатывал одно из своих собственных событий.Это не очень хорошая практика.
Вместо этого я бы использовал стратегию обратного вызова.
Во-первых, перекодируйте GridSquare
так:
public class GridSquare : PictureBox
{
/* As before */
public GridSquare(int x, int y, Action<GridSquare> clicked)
{
/* As before */
this.Click += (s, e) => clicked(this);
}
/* NO private void gridSquare_Click(object sender, EventArgs e) */
}
Теперь этодо вызывающего кода для выполнения тяжелой работы.
Я предполагаю, что вы создаете доску, используя что-то вроде вложенных циклов, которые добавляют каждый созданный GridSquare
в коллекцию Controls
формы.Если это так, вам нужно написать свой код следующим образом:
for (var x = 0; x < 8; x++)
{
for (var y = 0; y < 8; y++)
{
this.Controls.Add(new GridSquare(x, y, clicked));
}
}
Теперь вам просто нужно определить clicked
- обратный вызов при каждом нажатии GridSquare
- и этот код выглядит следующим образом:
GridSquare lastClicked = null;
Color lastBackColor = Color.Transparent;
Action<GridSquare> clicked = gs =>
{
lastClicked.BackColor = lastBackColor;
if (!lastClicked.Equals(gs))
{
lastClicked = gs;
lastBackColor = gs.BackColor;
gs.BackColor = Color.LightBlue;
var inner = gs.Piece != null
? String.Format("a {0} at ", gs.Piece.GetName())
: "";
var msg = String.Format("You clicked {0}({1}, {2})", inner, gs.X, gs.Y);
MessageBox.Show(msg);
}
};
Очевидно, что этот код идет до создания квадратов сетки.
За этим должно быть относительно легко следовать, но если нет, просто спросите, и я уточню.
Дайте мне знать, если это работает для вас.