Массив обьектов Windows Forms
Мне для проекта необходимо создать 64 чекбокса и как то принимать с них значения в bool массив. Типо как-то так:
for(int i;i<64;i++)
arr[i]=checkBoxArr[i].checked;
Как это можно грамотно сделать?
Уточнение 1:

Уточнение 2: Мне нужно это для такой светодиодной матрицы
Ответы (2 шт):
можно использовать datagrip в него тоже мохно пихать чекбоксы, к его елементам легко обращаться и сможете заполнить свой масив просто в двойном цикле(естественно если хотите хранить в двухмерном масиве)
Глядя на вашу задачу, мне захотелось написать оригинальное решение.
Дело в том, что 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.
