Попытка привязать поле со списком к перечислению в C#

У меня есть класс, содержащий свойство, которое является перечислением:

public RaTypes RaBucket1Type { get; set; }

Мое перечисление:

    public enum RaTypes
{
    Red,
    Yellow
}

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

cmbBucket1Type.DataSource = Enum.GetValues(typeof(RaTypes));

Когда я загружаю форму, я хочу заполнить поле со списком существующим значением. Я пробовал следующее:

        cmbBucket1Type.DisplayMember = "TradeType";
        cmbBucket1Type.ValueMember = "TradeEnumID";
        cmbBucket1Type.SelectedValue = EditedAlgorithm.RaBucket1Type;

Но это не сработало.

Кроме того, я не уверен, что правильно реализовал обработчик событий ValueChanged:

EditedAlgorithm.RaBucket1Type = (RaTypes)((ComboBox)sender).SelectedItem;

Может кто-нибудь помочь мне понять:

  1. Как установить поле со списком на текущее значение и
  2. Как обработать обработчик событий, чтобы я мог установить для свойства все, что было выбрано?

Спасибо - Ред.

ОБНОВЛЕНИЯ я пытался

    cmbBucket1Type.SelectedIndex = cmbBucket1Type.FindString(EditedAlgorithm.RaBucket1Type.ToString());

а также

    cmbBucket1Type.SelectedItem = EditedAlgorithm.RaBucket1Type;

Ни то, ни другое не работает.

Это ведь Windows Forms, верно?

Sweeper 25.06.2018 19:09

Вопрос Когда я загружаю форму, я хочу заполнить поле со списком существующим значением. не имеет большого смысла. В ComboBox мир заселять означает добавить предметы для ComboBox. Вы пытаетесь выбрать последнее значение, отображаемое во время загрузки?

Sach 25.06.2018 19:18

Я бы хотел: при загрузке формы добавить значение существующего свойства класса. Когда пользователь щелкает стрелку вниз, предлагаются (отображаются) все значения перечисления.

Ed Landau 25.06.2018 21:32

Да, форма Windows.

Ed Landau 25.06.2018 21:33
Стоит ли изучать 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
4
289
3

Ответы 3

Вы можете установить selectedValue следующим образом:

cmbBucket1Type.SelectedValue = EditedAlgorithm.RaBucket1Type;

И вы можете обработать выбранное значение, когда комбо изменится следующим образом:

        private void cmbBucket1Type_SelectedValueChanged(object sender, EventArgs e)
    {
        var selectedValue = cmbBucket1Type.SelectedValue;
    }

Спасибо за ответ, но я не вижу разницы между вашим предложением и тем, что я сказал. Я пробовал и не работал? "cmbBucket1Type.SelectedValue = EditedAlgorithm.RaBucket1Type;" это именно то, что я пробовал ... Есть ли опечатка ??

Ed Landau 25.06.2018 21:29

Я думаю, что вы используете терминологию немного иначе, чем обычно, что затрудняет понимание.

Обычно термины Добавлять, Заселить и Выбирать используются для обозначения следующего:

  • Добавить - добавить элемент к существующему набору элементов в поле со списком.
  • Заполнить - инициализировать поле со списком набором элементов.
  • Select (Display) - Выберите один из множества элементов в поле со списком в качестве выбранного элемента. Обычно этот элемент отображается в видимой области поля со списком.

Разобравшись с этим, я предполагаю, что вы хотите сделать следующее.

  1. Первоначально заселятьComboBox с набором значений. В вашем случае значения RaTypeEnum.
  2. Создайте экземпляр вашего класса, который содержит указанное свойство. Поскольку вы не назвали этот класс, я просто назову его SomeClass.
  3. Инициализируйте свойство RaBucket1Type указанного экземпляра класса с выбранным вами значением enum. Я инициализирую его на Yellow.
  4. У ComboBoxВыбрать указанное значение при запуске.
  5. После Form_Load, в любой момент времени, если пользователь изменяет значение ComboBox, это изменение будет отражено в свойстве экземпляра класса.

Для этого я бы сделал что-то вроде этого:

public partial class MainForm : Form
{
    // Your class instance.
    private SomeClass InstanceOfSomeClass = null;

    public MainForm()
    {
        InitializeComponent();
        // Initialize the RaBucket1Type property with Yellow.
        InstanceOfSomeClass = new SomeClass(RaTypes.Yellow);
        // Populating the ComboBox
        comboBox1.DataSource = Enum.GetValues(typeof(RaTypes));
    }

    // At selected index changed event
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        // Get the selected value.
        var selected = comboBox1.SelectedValue;
        // Change the `RaBucket1Type` value of the class instance according to the user choice.
        InstanceOfSomeClass.RaBucket1Type = (RaTypes)selected;
    }

    private void MainForm_Load(object sender, EventArgs e)
    {
        // At form load time, set the `SelectedItem` of the `ComboBox` to the value of `RaBucket1Type` of your class instance.
        // Since we initialized it to `Yellow`, the `ComboBox` will show `Yellow` as the selected item at load time.
        if (InstanceOfSomeClass != null)
        {
            comboBox1.SelectedItem = InstanceOfSomeClass.RaBucket1Type;
        }
    }
}

public enum RaTypes
{
    Red,
    Yellow
}

public class SomeClass
{
    public RaTypes RaBucket1Type { get; set; }

    public SomeClass(RaTypes raTypes) { RaBucket1Type = raTypes; }
}

Имейте в виду, что это базовый пример, показывающий, как справиться с ситуацией, а не полный законченный код. Вам нужно будет выполнить несколько проверок ошибок, чтобы убедиться, что экземпляры классов и выбранные элементы не равны нулю и т. д.

СПАСИБО! ... Я действительно пробовал это (SelectedItem = ...), но по какой-то причине это не работает. Я сделаю еще немного отладки и опубликую то, что найду (надеюсь, ответ). ОЧЕНЬ странный аспект, который я замечаю во время отладки, заключается в том, что когда я заполняю поле со списком, назначая его источник данных (как показано выше), я вижу изменение свойства класса. Очень странное поведение, поскольку эти два понятия не должны быть связаны. Обожаю / ненавижу эти баги :)

Ed Landau 26.06.2018 19:56

НАШЕЛ ОТВЕТ:

У меня было событие SelectedIndexChanged, указывающее на мой обработчик событий, что означает, что когда я «добавлял» элементы в ComboBox, используя:

comboBox1.DataSource = Enum.GetValues(typeof(RaTypes));

он запускал обработчик событий и сбрасывал свойство моего класса. Мой обработчик событий был таким:

var selectedValue = cmbBucket1Type.SelectedValue;

Итак, простое решение заключалось в следующем:

  1. Удалите жестко запрограммированный обработчик событий из графического интерфейса Visual Studio.
  2. Добавьте следующий обработчик событий в код ПОСЛЕ Я назначаю DataSource

    bucketType1.SelectedIndexChanged + = BucketTypeChanged;

Это сработало.

СПАСИБО ВСЕМ ЗА ПОМОЩЬ !!

- Ред.

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