2010-07-28 22 views
7

Benim C# uygulama,olay ile bir comboBox vardır. Genellikle, bu olayın ateşlenmesini istiyorum, ama bazen olayın ateş edilmesine ihtiyacım var. Benim comboBox bir MRU dosya listesidir. Listede bir dosya bulunamazsa, öğe comboBox'dan kaldırılır ve comboBoxSelectedIndex sıfıra ayarlanır. Ancak, comboBoxSelectedIndex değerini sıfır olarak ayarlamak, SelectedIndexChanged olayının tetiklenmesine neden olur; bu, bu durumda sorunludur çünkü bazı UIF kodları olay işleyicisinde çalıştırılmasına neden olur. C# form denetimleri için olayları devre dışı bırakmak/etkinleştirmek için zarif bir yol var mı? Teşekkürler. ediyoruz Sorun farklı EventHandler ile size ilk eventhandler olay kaydını kaldırmak olsaydıC# Uygulaması tetiklenmeden ComboBox SelectedIndex değiştiriliyor #

cevap

11

ComboBox combo = sender as ComboBox; 
if (combo.SelectedIndex == 0) 
{ 
    return; 
} 

ile eventhandler yöntemini başlatın

.

combo.SelectedIndexChanged -= EventHandler<SelectedIndexChangedEventArgs> SomeEventHandler; 
combo.SelectedIndex = 0; 
combo.SelectedIndexChanged += EventHandler<SelectedIndexChangedEventArgs> SomeEventHandler; 
1

One (oldukça çirkin) yolu girişi siler kodunda bir bayrak ayarlayın ve sonra SelectedIndexChanged işleyicisinde kontrol etmek olacaktır:

if (!deletedEntry) 
{ 
    // Do stuff 
} 
deletedEntry = false; 

daha iyi bir yolu kaldırmak olabilir senin Silme yönteminin başlangıcında SelectedIndexChanged olay işleyicisi ve sonunda yeniden durumuna getirin. Bu şekilde kod, endeksin değiştiğini bilmez.

8

Yıllar boyunca birçok kez karşılaştım. Benim çözümüm, _noise adında bir sınıf düzeyi değişkenine sahip olmak ve eğer seçili indeks değiştiğinde açılan combo veya diğer herhangi bir benzer kontrolün indeksini değiştirmek üzereysem, aşağıdaki kodu koyarım. Ben aşağıdakileri yapın ben endeksi değiştirmek için gidiyorum bildiğinizde İşte



private bool _noise; 

private void cbTest_SelectedIndexChange(object sender, EventArgs e) 
{ 
    if (_noise) return; 

    // process the events code 

    ... 

} 


Ardından kumanda olay işleyicisi kodudur:

_noise = true; // cause the handler to ignore the noise... 


cbTest.Index = value; 


_noise = false; // let the event process again 
3

Bunu yapmanın daha iyi bir yolu olmadığına şaşırdım, ama bu benim yaptığım yol. Çoğu denetimin Tag alanını kullanıyorum, bu yüzden denetimi alt sınıflara ayırmam gerekmiyor. Ve null varsayılan olduğundan true/null değerlerini kullanıyorum. Aslında Tag kullanıyorsanız Tabii

, sen işleyicisi

... farklı yapmak gerekir: Ana kodunda

private void control_Event(object sender, EventArgs e) 
{ 
    if (control.Tag != null) return; 

    // process the events code 

    ... 

} 

try 
{ 
    control.Tag = true; 
    // set the control property 
    control.Value = xxx; 
or 
    control.Index = xxx; 
or 
    control.Checked = xxx; 
    ... 
} 
finally 
{ 
    control.Tag = null; 
}