Добавление значений массива в поля со списком с помощью функции – Winforms C#

Я пытаюсь систематически назначать параметры скорости передачи данных для 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);
    }
}

Если имеет смысл просто жестко запрограммировать значения скорости, то я сделаю это вместо этого.

Вы можете прочитать Обрабатывать и вызывать события.

user246821 07.08.2024 18:21

Почему бы и нет baudBox.DataSource = baud;, где baud ваш массив int?

György Kőszeg 07.08.2024 18:23

Кроме того, в обработчике событий вы добавляете эти элементы каждый раз, когда щелкаете поле со списком. Но, возможно, это не то, что вам хотелось бы сделать.

György Kőszeg 07.08.2024 18:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы хотите запустить это при нажатии, обработчики событий управления должны следовать определенной сигнатуре. Подпись события клика выглядит следующим образом:

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?

Robbie Schertz 07.08.2024 19:34

@RobbieSchertz Это однострочник: baudBox3.Items.AddRange(new int[] {9600, 19200, 38400, 57600 });

Joel Coehoorn 07.08.2024 20:45

Вам следует использовать привязку данных и свойство 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>; }
}

Другие вопросы по теме