Установите значение ComboBox по умолчанию без прямого изменения SelectedIndex

У меня есть 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 пользователем без этого цикла?


person jacobz    schedule 23.12.2013    source источник


Ответы (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();
}
person dovid    schedule 23.12.2013
comment
Это странно вызывает Sytem.ObjectDisposedExecution. - person jacobz; 23.12.2013
comment
это другая проблема. - person dovid; 23.12.2013

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

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
}
person Austin    schedule 23.12.2013
comment
какой SomeCallingMethod()? вы можете изменить свойство напрямую. - person dovid; 23.12.2013
comment
@lomed SomeCallingMethod() — это всего лишь пример того, как можно использовать это свойство. - person Austin; 23.12.2013