WinForms comboBox_SelectedValueChanged запускается трижды на вкладкеControl_SelectedIndexChanged - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть элемент tabcontrol с несколькими вкладками. На вкладке 2 (индекс 1) у меня есть выпадающий список, который управляет выбором шаблона. Сам шаблонный объект содержит идентификатор и имя

internal class Template
{
    public Template(double id, string name)
    {
        ID = id;
        Name = name;
    }

    public double ID { get; private set; }
    public string Name { get; private set; }
}

С помощью этого комбинированного списка я хочу отобразить имя и выбрать идентификатор. Я приведу полный рабочий пример.

Моя форма

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        cmbx = new Cmbx(comboBox1); // pass in the combobox element
    }

    private Cmbx cmbx; // My combobox class

    private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (tabControl1.SelectedIndex == 1) // tab 2 active?
        {
            cmbx.CreateTemplateSelection(myTemplates); // init combobox with the templates list
        }
    }

    private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
    {
        // handle the new selected ID here
        MessageBox.Show($"Combobox Change Event - Selected ID {cmbx.SelectedTemplateID}");
    }
}

и мой класс со списком

class Cmbx
    {
        public Cmbx(ComboBox cmbx)
        {
            this.cmbx = cmbx;
        }

        private ComboBox cmbx; // GUI element
        private Template[] currentTemplates;

        public double SelectedTemplateID // Get the current selected value
        {
            get
            {
                Template templateInfo = cmbx.SelectedValue as Template;
                return templateInfo.ID;
            }
        }

        public void CreateTemplateSelection(Template[] templates) // populate the combobox
        {
            if (currentTemplates != null) // first time?
            {
                if (currentTemplates.SequenceEqual(templates)) // different data?
                {
                    return; // nothing changed -> return
                }
            }

            // different data

            cmbx.DataSource = null; // clear the combobox
            cmbx.Items.Clear();

            BindingSource bindingSource = new BindingSource();
            bindingSource.DataSource = templates;
            cmbx.DataSource = bindingSource.DataSource; // setup the data

            cmbx.DisplayMember = nameof(Template.Name); // display the template name
            cmbx.ValueMember = nameof(Template.ID); // select the template id

            bool valid = templates.Length > 0; // existing data?

            if (valid && cmbx.SelectedIndex != 0)
                cmbx.SelectedIndex = 0; // select the first item

            currentTemplates = templates; // assign the new templates to the current ones
        }
    }

При запуске проекта и выборе второй вкладки comboBox1_SelectedValueChanged срабатывает 3 раза.

При первом и втором запуске cmbx.SelectedTemplateID возвращает мне выбранный идентификатор шаблона 1. Это правильно.

Третий прогон возвращает мне нулевой указатель.

Почему он срабатывает 3 раза? И почему третий вызов события возвращает нулевой указатель?

1 Ответ

0 голосов
/ 02 ноября 2018

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

cmbx.DataSource = null;
cmbx.Items.Clear();

и

cmbx.ValueMember = nameof(Template.ID);

Далее я изменил порядок привязки

BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = templates;

cmbx.DisplayMember = nameof(CoBRATemplate.Name);

cmbx.DataSource = bindingSource.DataSource;

Это работает для меня. Но, пожалуйста, не стесняйтесь дать "лучший" ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...