Вы можете рассмотреть возможность использования TableLayoutPanel в вашей форме.
Один из методов, который вы можете использовать, - это создание отдельных элементов управления, либо в конструкторе, если это сетка фиксированного размера, либо в программном коде для сетки переменного размера, и помещать их в (или добавлять их) ячейки сетки ,
Если вам нужно обработать события щелчка, вы можете связать события для всех элементов управления с одним обработчиком (описано в статье, на которую вы ссылались). Затем установите свойство тега каждого элемента управления, чтобы отразить расположение сетки. Например, если ваша сетка меньше десяти на десять, установите тег, используя целое число со столбцом в десятке и строкой в одном месте. В подпрограмме-обработчике tou может определить, какой элемент управления был выбран, используя свойство sender.tag.
--- После дальнейшего чтения кажется, что вы можете использовать метод TableLayoutPanel GetPositionFromControl, чтобы получить позицию для определения элемента управления, вызвавшего событие, т.е. Я собираюсь попробовать это в моем коде позже, возможно, я смогу избавиться от тегов.
Если вам не нужно обрабатывать события, вы можете использовать метод GetControlFromLocation TablelayoutPanel для доступа к отдельным элементам управления.
Таким образом, вы можете использовать TableLayoutPanel в качестве двумерного управляющего массива без необходимости кодировать собственный массив.