Я пытаюсь систематически назначать параметры скорости передачи данных для 4 различных полей со списком, но я не хочу жестко запрограммировать их, как сейчас.
ТЕКУЩЕЕ РЕШЕНИЕ:
baudBox3.Items.Add(9600);
baudBox3.Items.Add(19200);
baudBox3.Items.Add(38400);
baudBox3.Items.Add(57600);
baudBox3.SelectedItem = 9600;
Я бы предпочел иметь функцию, в которую я мог бы передавать значения массива с помощью поля со списком, которое я хочу обновить, но она не может заставить ее работать должным образом.
int[] baud = { 9600, 19200, 38400, 57600 };
baudBox3.Click += AddToCombo(baud, baudBox3);
public void AddToCombo(Array array, ComboBox c)
{
foreach (var a in array)
{
c.Items.Add(a);
}
}
Если имеет смысл просто жестко запрограммировать значения скорости, то я сделаю это вместо этого.
Почему бы и нет baudBox.DataSource = baud;, где baud ваш массив int?
Кроме того, в обработчике событий вы добавляете эти элементы каждый раз, когда щелкаете поле со списком. Но, возможно, это не то, что вам хотелось бы сделать.





Если вы хотите запустить это при нажатии, обработчики событий управления должны следовать определенной сигнатуре. Подпись события клика выглядит следующим образом:
private void button1_Click(object sender, System.EventArgs e)
В EventArgs нет места для вашего массива baud. Здесь есть два решения: одно — наследовать новый класс от EventArgs со свойством вашего массива и использовать его. Но это перебор. Другой способ — просто ссылаться на массив как на член класса формы. Давайте пока остановимся на этом.
(Но если бы вы действительно хотели использовать EventArgs, типом был бы int[], а не Array, используемый с методом в вопросе).
Итак, теперь у нас есть это:
int[] baud = { 9600, 19200, 38400, 57600 };
baudBox3.Click += AddToCombo;
private void AddToCombo(object sender, System.EventArgs e)
{
var cb = sender as ComboBox;
cb.Items.Clear();
foreach (var b in baud)
{
cb.Items.Add(b);
}
}
Или еще лучше:
int[] baud = { 9600, 19200, 38400, 57600 };
baudBox3.Click += AddToCombo;
private void AddToCombo(object sender, System.EventArgs e)
{
var cb = sender as ComboBox;
cb.Items.Clear();
cb.Items.AddRange(baud);
}
Но также нам нужно больше подробностей о том, что вы подразумеваете под «не работает должным образом». В каком смысле? Какое поведение вы видите вместо этого?
Наконец, это не запустится до тех пор, пока кто-нибудь не щелкнет по полю, и не каждое действие нажатия кнопки мыши является формальным «щелчком». Вы уверены, что это не должно запускаться просто при загрузке формы? Вы можете сделать это всего одной строкой в событии Form_Load:
baudBox3.Items.AddRange(new int[] {9600, 19200, 38400, 57600 });
это все очень полезно, спасибо! и вы совершенно правы, его нужно вызывать только тогда, когда я загружаю форму. Как вызов функции будет выглядеть в FormLoad?
@RobbieSchertz Это однострочник: baudBox3.Items.AddRange(new int[] {9600, 19200, 38400, 57600 });
Вам следует использовать привязку данных и свойство ComboBox.DataSource, чтобы напрямую назначить массив или список элементам поля со списком.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
comboBox1.SelectedIndexChanged += (s, ev) =>
{
label2.Text = $"{comboBox1.SelectedValue} baud selected.";
};
comboBox1.DataSource = new [] { 9600, 19200, 38400, 57600 };
}
public IReadOnlyList<int> BaudRates { get => comboBox1.DataSource as IReadOnlyList<int>; }
}
Вы можете прочитать Обрабатывать и вызывать события.