У меня есть ComboBox с парой предметов. Я хочу поместить SelectedIndex ComboBox в 0, поэтому, когда пользователь запускает его, первый элемент уже выбран (по умолчанию).

Однако выполнение этого (combobox.SelectedIndex = 0;) мешает моему событию combobox_SelectedIndexChanged(), которое происходит, когда пользователь изменяет SelectedIndex ComboBox, перезапуская программу:

private void combobox_SelectedIndexChanged(object sender, EventArgs e)
        {
            Process.Start(Application.ExecutablePath);
            this.Close();
        }

Это вызовет бесконечный цикл combobox_SelectedIndexChanged(), так как combobox.SelectedIndex = 0; вызовет его, который снова вызовет другой цикл и так далее ...

Есть ли способ позволить программе что-то делать при изменении SelectedIndex пользователем без этого цикла?

4
jacobz 23 Дек 2013 в 21:55

2 ответа

Лучший ответ

Удалите обработчик событий (щелкните значок молнии в верхней части панели свойств. затем очистите обработчик SelectedIndexChanged).

А в коде конструктора сначала установите SelectedValue, а затем добавьте обработчик событий. здесь:

public Form1()
{
    InitializeComponent();

    comboBox1.SelectedIndex = 0;
    comboBox1.SelectedIndexChanged += combobox_SelectedIndexChanged;
}

private void combobox_SelectedIndexChanged(object sender, EventArgs e)
{
    Process.Start(Application.ExecutablePath);
    this.Close();
}
7
dovid 23 Дек 2013 в 18:17

Вы можете добавить свойство для подавления выполнения события

internal bool SupressSelectIndexChanged {get; set;}

private void SomeCallingMethod(){
   this.SupressSelectIndexChanged = true;
   combobox.SelectedIndex = 0;
   this.SupressSelectionIndexChanged = false;
}

private void combobox_SelectIndexChanged(object sender, EventArgs e){
    if(this.SupressSelectIndexChanged){ return; }

    // - execution logic
}
0
Austin 23 Дек 2013 в 18:08