Массив обьектов Windows Forms

Мне для проекта необходимо создать 64 чекбокса и как то принимать с них значения в bool массив. Типо как-то так:

for(int i;i<64;i++)
 arr[i]=checkBoxArr[i].checked;

Как это можно грамотно сделать? Уточнение 1:
что-то такое

Уточнение 2: Мне нужно это для такой светодиодной матрицы


Ответы (2 шт):

Автор решения: Yaroslav Hryhorenko

можно использовать datagrip в него тоже мохно пихать чекбоксы, к его елементам легко обращаться и сможете заполнить свой масив просто в двойном цикле(естественно если хотите хранить в двухмерном масиве)

→ Ссылка
Автор решения: aepot

Глядя на вашу задачу, мне захотелось написать оригинальное решение.

Дело в том, что 64 чекбокса, это как 64 бита, а в C# есть 64-битное беззнаковое число - ulong или еще оно называется UInt64. То есть каждый чекбокс можно представить в виде отдельного бита такого числа.

Для наглядности я не использовал дизайнер, ну разве только что создал обработчик события Form.Load там. Весь код приложения ниже. Так же я написал несколько дополнительных методов, которые в решении не используются, но вам могут пригодиться.

public partial class Form1 : Form
{
    private Label myLabel;
    private TextBox myTextBox;
    private Button myButton;
    private FlowLayoutPanel myPanel;

    private ulong _state;

    private ulong State
    { 
        get => _state; 
        set
        {
            _state = value;

            // преобразует состояние в двоичное представление, для красоты
            myLabel.Text = Convert.ToString((long)_state, 2).PadLeft(64, '0');
        }
    }


    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        myPanel = new FlowLayoutPanel // Контейнер для чекбоксов
        {
            Width = 160,
            Height = 160,
            Left = 10,
            Top = 10,
            FlowDirection = FlowDirection.LeftToRight
        };

        // заполняем контейнер
        ulong j = 1;
        for (int i = 0; i < 64; i++)
        {
            CheckBox checkBox = CreateCheckBox(j);
            myPanel.Controls.Add(checkBox);
            j *= 2;
        }
        Controls.Add(myPanel);

        // отображает состояние в двоичном представлении
        myLabel = new Label { Left = 180, Top = 10, Width = 400 };
        Controls.Add(myLabel);

        // сюда можно ввести порядковый номер чекбокса от 0 до 63 ...
        myTextBox = new TextBox { Left = 180, Top = 40, Text = "0", TextAlign = HorizontalAlignment.Right };
        Controls.Add(myTextBox);

        // ... и нажать эту кнопку, MessageBox покажет True или False
        myButton = new Button { Left = 290, Top = 39, Height = 22, Text = "Show" };
        myButton.Click += MyButton_Click;
        Controls.Add(myButton);

        // Загрузить состояние в чекбоксы, любое число от 0 до ulong.MaxValue, где последнее - это все включены
        // LoadState(ulong.MaxValue); 
    }

    private void MyButton_Click(object sender, EventArgs e)
    {
        // Показывает состоние бита, по индексу
        if (int.TryParse(myTextBox.Text, out int number) && number >= 0 && number < 64)
        {
            MessageBox.Show($"{number}, {GetState(number)}");
        }
    }

    // создает настроенный чекбокс
    private CheckBox CreateCheckBox(ulong value) 
    {
        CheckBox checkBox = new CheckBox
        {
            Width = 20,
            Height = 20,
            Margin = new Padding(0),
            CheckAlign = ContentAlignment.MiddleCenter,
            Tag = value
        };
        checkBox.CheckedChanged += CheckBox_CheckedChanged;
        return checkBox;
    }

    // при тыке в чекбокс изменяет состояние
    private void CheckBox_CheckedChanged(object sender, EventArgs e) 
    {
        CheckBox checkBox = (CheckBox)sender;
        State ^= (ulong)checkBox.Tag;
    }

    // грузит состояние в чекбоксы, старое состояние стирается
    private void LoadState(ulong state)
    {
        State = 0;
        foreach (CheckBox checkBox in myPanel.Controls)
            checkBox.Checked = (state & (ulong)checkBox.Tag) > 0;
    }

    // получает состояние любого чекбокса по номеру 0..63
    private bool GetState(int position)
    {
        if (position >= 0 && position < 64)
            return (State & (1ul << position)) > 0;
        else
            throw new ArgumentOutOfRangeException("GetState: Индекс должен быть в пределах от 0 до 63");
    }

    // ответ на ваш вопрос, так можно получить состояние в виде массива, а надо ли оно теперь вам?
    // например: bool[] stateArray = GetArray();
    private bool[] GetArray()
    {
        bool[] result = new bool[64];
        for (int i = 0; i < 63; i++)
            result[i] = GetState(i);
        return result;
    }
}

Выглядит это так

введите сюда описание изображения

Что хорошего в хранении всего состояния матрицы в одном числе? Да все просто - 8 байт, это можно записать в файл как число, это можно передать по сети как число. Просто сохраните или передайте State.

→ Ссылка