Итак, у меня есть WinForm в моей программе, которая содержит серию каждого из ComboBox и двух TextBox. Есть atm 8 линий, но их общее количество увеличится до 32, поэтому я хотел бы работать с массивом или подобным. Как мне это сделать?
Мой текущий рабочий метод заключается в том, что я вручную создаю новый массив TextBoxes / ComboBox, которому я назначаю указанный Elemt WinForm. Поэтому у меня есть такой список:
tbGU[0] = tbGU1;
tbGO[0] = tbGO1;
cbS[0] = cbS1;
Конечно, это выглядит ужасно и не очень хорошо, если его много раз копируют. У кого-нибудь есть решение моей проблемы?
Мне нужно получить доступ к SelectedIndex ComboBox и тексту TextBoxes. Я надеялся, что мне удастся избежать создания всех элементов вручную с помощью кода.
Рассматривали ли вы использование элемента управления DataGridView, где можно динамически создавать несколько элементов управления?
Вы всегда можете использовать List<T> и инициализировать за один раз: List<ComboBox> cBoxes = new List<ComboBox>() {cbS1, cbS12, cbS3...}; Вы получаете доступ к нему, как к массиву.
Как написано ниже, они не могут быть равномерно распределены, потому что они расположены вокруг / на графике, поэтому DataGridView неприемлем для моего приложения. Я собираюсь использовать сокращенную версию Versionen либо с помощью List, либо с помощью new [] (представьте, что позже).





Одно простое решение - использовать синтаксис инициализатора массива:
ComboBox[] cbS = new[] { cbS1, cbS2, cbS3 ... };
Другой способ сделать это - полностью избавиться от переменных cbS1, cbS2 ... cBSn и создать элементы управления в цикле for.
ComboxBox[] cbS = new ComboBox[32];
// declare the text box arrays here as well
for (int i = 0 ; i < cbS.Length ; i++) {
cbS[i] = new ComboBox();
cbS[i].Location = ... // use "i" to help you position the control
// configure your combo box ...
this.Controls.Add(cbS[i]);
// do the same for the text boxes.
}
Третий способ - создать настраиваемый элемент управления:
// name this properly!
public class MyControl: UserControl {
public ComboBox CbS { get; }
public TextBox TbGU { get; }
public TextBox TbGO { get; }
public MyControl() {
// create and configure the combo box and text boxes here ...
}
}
Затем вы можете использовать цикл for для создания множества MyControl.
К сожалению, они не распределяются равномерно в моем фрейме (например, с использованием своего рода самодельного CardLayout, похожего на java, и даже там они устанавливаются в соответствии с графикой, поэтому нет «правила» относительно того, как он устанавливается. Вероятно, я буду придерживаться моего метода, но поменяю его на свою более короткую версию.
@Martin Но поля со списком и текстовые поля соответствуют друг другу, верно? Если они связаны, вам следует создать настраиваемый элемент управления.
Что ж, может быть твое право и я должен их использовать, я рассматриваю это атм. Чтобы уточнить, я выбираю датчик в поле со списком, для которого я должен установить два критических значения (для дальнейшего процесса). Вы также выбираете положение датчика, которое отмечается с помощью индекса элемента (это довольно сложный Измерительная система, которую я должен контролировать с помощью приложения, отсюда!> 32 датчика xD). Хотя я уже рад, что мне удалось хотя бы минимизировать (минимум) 96 строк до 3 (очень громоздких) строк. Спасибо за это
Вы думали о том, чтобы поместить три элемента управления (ComboBox, 2xTextBox) в пользовательский элемент управления. Тогда вам придется иметь дело с 1/3 от общего количества элементов управления.