2011-11-11 6 views
26

Denetimi programlı olarak denetlerken CheckedChanged olayını nasıl tetiklerim?Bir denetleme programlı olarak denetlenirken CheckedChanged olayının nasıl tetikleneceği nasıl engellenir?

Genellikle bunu şu şekilde yapıyorum.

private bool isFrozen = false; 

private void btn1_CheckedChanged(object sender, EventArgs e) 
{ 
    if (isFrozen) 
     return; 

    isFrozen = true; 
    btn2.Checked = false; 
    isFrozen = false; 

    // Do some stuff 
} 

private void btn2_CheckedChanged(object sender, EventArgs e) 
{ 
    if (isFrozen) 
     return; 

    isFrozen = true; 
    btn1.Checked = false; 
    isFrozen = false; 

    // Do another stuff 
} 

Daha iyi veya daha yaygın bir çözüm var mı?

+1

Bu uygun yoldur. Teknik olarak, nihayet bir blokta false'ye geri döner. –

cevap

40

Bence yolun iyi.

Bunu yapmanın diğer bir yolu, checks'den önce EventHandler'ı kaldırır ve ardından kontrolden sonra tekrar eklemektir. Bu şekilde isFrozen değişkenine olan ihtiyacı ortadan kaldırır. VB

private void btn1_CheckedChanged(object sender, EventArgs e) 
{ 
    btn2.CheckedChanged -= btn2_CheckedChanged; 
    btn2.Checked = false; 
    btn2.CheckedChanged += btn2_CheckedChanged; 

    // Do some staff 
} 

private void btn2_CheckedChanged(object sender, EventArgs e) 
{ 
    btn1.CheckedChanged -= btn1_CheckedChanged; 
    btn1.Checked = false; 
    btn1.CheckedChanged += btn1_CheckedChanged; 

    // Do another staff 
} 
+0

İyi fikir. Olayları kaldırmayı hiç düşünmedim. – Zenya

+0

güzel basit bir çözüm Lars – WraithNath

+1

Bu doğru cevap olarak işaretlenmelidir. OP'nin yaklaşımına karşı bu işlevlerin nasıl fark edileceği konusunda fark edilebilir bir farklılık olmasa bile, bu niyetin açık bir şekilde ifade edileceğinden, bu kod üzerinde çalışan bir sonraki kişi, neyin yapıldığını ve niçin yorum yapmasa bile, neyin yapıldığını ve neden olduğunu açıkça anlayabilir. – Jim

5

:

RemoveHandler btn2.CheckedChanged, AddressOf btn2_CheckedChanged 
btn2.Checked = false 
AddHandler btn2.CheckedChanged, AddressOf btn2_CheckedChanged 
+3

Cevap, C# değil VB hakkındaydı. –

+4

Ancak, C# dilinde (ilk dilimiz) bunu nasıl yapacağımızı düşünen, ancak kodu VB.net'e (müşterinin talebi) yazmak zorunda olan bazılarımız için yararlıdır. –

+0

Bu cevabı çok takdir ederken, kabul edilen cevaba bir yorum olarak eklenmesi gerektiğini düşünüyorum. – Eric

4

Bir süre böyle bir şey uygulamak isteyen sonra bu yazı geldi. National Instruments'tan düzenli olarak Measurement Studio'yu ve StateChanging veya StateChanged olayına sahip olan WinForms denetimlerini, ActionEventArgs türünde bir parametre iletirim. Bu, üç değeri alabilen bir özelliğe sahiptir: ByKeyboard, ByMouse ve Programatic. Bu, kontrol durumunun değişmesine neyin yol açtığını belirlemede çok faydalıdır. Bunu standart bir WinForms onay kutusunda çoğaltmak istedim. Ben yapmak için iyileştirmeler vardır eminim

public enum ControlSource 
{ 
    Programatic, 
    ByKeyboard, 
    ByMouse 
} 

public class AwareCheckBox : Checkbox 
{ 
    public AwareCheckBox() 
      : base() 
    { 
     this.MouseDown += AwareCheckbox_MouseDown; 
     this.KeyDown += AwareCheckbox_KeyDown; 
    } 

    private ControlSource controlSource = ControlSource.Programatic; 

    void AwareCheckbox_KeyDown(object sender, KeyEventArgs e) 
    { 
     controlSource = ControlSource.ByKeyboard; 
    } 

    void AwareCheckbox_MouseDown(object sender, MouseEventArgs e) 
    { 
     controlSource = ControlSource.ByMouse; 
    } 

    public new event AwareControlEventHandler CheckedChanged; 
    protected override void OnCheckedChanged(EventArgs e) 
    { 
     var handler = CheckedChanged; 
     if (handler != null) 
      handler(this, new AwareControlEventArgs(controlSource)); 

     controlSource = ControlSource.Programatic; 
    } 
} 

public delegate void AwareControlEventHandler(object source, AwareControlEventArgs e); 

public class AwareControlEventArgs : EventArgs 
{ 
    public ControlSource Source { get; private set; } 

    public AwareControlEventArgs(ControlSource s) 
    { 
     Source = s; 
    } 
} 

ama benim ilkel test çalıştığını göstermiştir:

İşte benim kodudur. Burada, diğerlerinin bu konuya karışması ve değişikliğin başlatılmasının nerede olduğunu ayırt etmenin daha açık bir yolunu istemek için buraya gönderdim. Herhangi bir yorum hoşgeldiniz.

İlgili konular