WinForms SelectedIndexChangeCommitted не запускается - PullRequest
0 голосов
/ 18 марта 2020

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

На этот вопрос SO был дан ответ, предложив две вещи:

1) Перед и после загрузки данных в комбинированный список используйте этот код:

private void LoadYourComboBox()
{
    this.comboBox1.SelectedIndexChanged -= new EventHandler(comboBox1_SelectedIndexChanged);
        // Set your bindings here . . .
    this.comboBox1.SelectedIndexChanged += new EventHandler(comboBox1_SelectedIndexChanged);
}

Я пробовал это с этим кодом:

this.cboSelectCategory.SelectedIndexChanged -= new EventHandler(cboSelectCategory_SelectedIndexChanged);

Тем не менее, часть cboSelectCategory_SelectedIndexChanged имеет красную ошибку волнистой и парящий над ним говорит: The name cboSelectCategory_SelectedIndexChanged does not exist in the current context. Я попробовал этот код как в форме form_load, так и в методе, который фактически заполняет комбинированный список.

2) На этот же вопрос SO был дан ответ для использования события SelectedIndexChangeCommitted.

private void cboSelectCompany_SelectedIndexChangeCommitted(object sender, EventArgs e)
{
    string selectedCat = cboSelectCategory.SelectedValue.ToString();
    Console.WriteLine(selectedCat);
}

Но это событие не срабатывает, когда я изменяю выделение в выпадающем списке.

Я что-то упустил? Мой код выключен или не в том месте?

1 Ответ

1 голос
/ 18 марта 2020

Так что, очевидно, я не хочу, чтобы код в методе SelectedIndexChanged срабатывал при загрузке формы.

Если вы связываете свой выпадающий список в конструкторе формы (после InitializeComponent()), тогда SelectedIndexChanged сработает до того, как форма станет видимой, поэтому вы можете просто вернуться из события selectedindexlated, если форма невидима:

    public MainForm()
    {
        InitializeComponent();

        DataTable dt = new DataTable();
        dt.Columns.Add("Name");
        dt.Columns.Add("Code");


        dt.Rows.Add("Milk", "MLK");
        dt.Rows.Add("Bread", "BRD_WHITE");
        dt.Rows.Add("Bread", "BRD_BROWN");
        dt.Rows.Add("Coffee", "COFF");

        comboBox1.DataSource = dt;
        comboBox1.DisplayMember = "Name";
        comboBox1.ValueMember = "Code";

    }


    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (!this.Visible)
            return;

        MessageBox.Show("a");
    }

Часто проще просто вернуться из обработчика события в нежелательное время, чем бездельничать, пытаясь удалить и добавить обработчики событий дизайнер InitializeComponent() вызывает Begin / EndInit для компонентов в начале и конце

...