vb.net: События кликов сапера

Я начал делать игру Minesweeper в vb.net, используя динамически созданную сетку кнопок, которые хранятся в 2D-массиве. У меня есть еще один 2D-массив (Boolean), который отслеживает, закрыта или открыта определенная позиция. И у меня есть метод «обновить сетку», который можно запускать в любое время, чтобы обновить сетку, чтобы все, что должно быть раскрыто, было раскрыто на экране.

Как мне сделать так, чтобы при нажатии любой кнопки состояние этой кнопки устанавливалось как открытое? Я попытался использовать обработчик событий, но не смог передать никаких аргументов, и мне нужно знать положение кнопки x и y, чтобы я мог найти правильную кнопку.

Спасибо.


person SiliconCelery    schedule 08.12.2011    source источник
comment
Найдите sender в массиве кнопок. Или используйте свойство Tag.   -  person Hans Passant    schedule 08.12.2011
comment
@HansPassant - у меня есть некоторые проблемы с идеей «отправитель», в основном из-за того, что я не могу использовать аргументы, а это то, что мне нужно. Но свойство тега выглядит очень хорошо. Единственная проблема заключается в том, что я могу установить для свойства tag только одно значение, а мне нужно два, одно для координаты X, другое для координаты Y. Итак, есть ли способ отправить два значения, отправить координаты как одно значение или отправить значение в виде строки, а затем преобразовать эту строку в имя переменной?   -  person SiliconCelery    schedule 08.12.2011
comment
Вам нужен только один, он может ссылаться на объект класса с большим количеством информации.   -  person Hans Passant    schedule 08.12.2011
comment
Вы должны знать, сколько строк/столбцов находится в сетке, поэтому вы можете установить для тега целочисленное значение, которое представляет количество ячеек от нижнего левого угла, а затем убрать X/Y, если вам это нужно. НАПРИМЕР. Для сетки 5x5 значение тега 9 даст X=4 и Y=2.   -  person Casey Wilkins    schedule 09.12.2011


Ответы (1)


Вы можете поместить все свои кнопки в Dictionary(Of Button, Boolean), каждая со значением True. Позже в вашем обработчике событий Click отправитель будет преобразован в Button и для соответствующей записи в словаре будет установлено значение False.

Что-то вроде этого (извините за мой плохой VB, я обычно использую С#):

 Buttons = new Dictionary(Of Button, Boolean)()
 For Each button in YourButtonArray
     Buttons.Add(button, True)
 End

 ' Click handler:
 Dim clickedButton = CType(sender, Button)
 Buttons(clickedButton) = False

Обновление: В качестве альтернативы, как указал @Hans Passant в комментариях к вашему вопросу, вы можете использовать свойство Tag, что было бы проще.

person Dennis Traub    schedule 08.12.2011
comment
Что означает приведение отправителя к кнопке? - person SiliconCelery; 08.12.2011
comment
Приведение типов. Ваш обработчик событий знает его sender. Приведите это к типу Button, чтобы вы могли использовать его в качестве ключа в своем словаре. - person Dennis Traub; 08.12.2011