2010-09-17 9 views
6

C# ve Windows Form'ları için yeniyim ama bir telsizim varsa ve ben radiobutton1.Checked = true dediğimde CheckedChange olayını tetiklemenin bir yolu var mı? Kullanıcıyı radyo düğmesine tıklamak ve radyo düğmesini program aracılığıyla ayarlamak arasında ayrım yapmak istiyorum. Mümkün mü?Bir RadioBox'ta Checked özelliğini ayarladığınızda CheckChanged olayını engelleyebilir misiniz?

+2

Bu bana bir tasarım sorunu gibi geliyor. Hangi davranışları tanımlamaya çalışıyorsunuz? – womp

+0

Evet, muhtemelen etrafı tasarlayabilirsiniz ancak SetValue çağrılırsa, olayları göndermemeyi denetlerim. wxWidgets böyle çalışır ve hayatı kolaylaştırır.Tamam, cevabı hayır gibi görünüyor; olay tetiklendi ve bastırılamaz. Teşekkürler. – genomess

cevap

1

Neden kodunuzu radyo düğmesini denetleyen dikkat etmelisiniz?

DÜZENLEME: Bu (alt sınıf, bayrak) etrafında yollar vardır, ancak , yapmaz. Bunu istemek için düşünebildiğim tek “yasal” neden, değer başlangıçta (programatik olarak) görüntülendiğinde ve hatta şüphelendiğinde bazı yan etkilerin gerçekleşmesini önlemektir. Yan etkiyi yeniden düşünün, gerçekten değişiklik olayına mı ait mi, yoksa taahhütte mi?

Daha fazla bilgi bir neden/ne yardımcı olur. Yüzeyde, bu bir tasarım hatası gibi görünüyor.

o Checked özelliği programlı ayarlanmışsa olayı bastırmak, RadioButton alt sınıf ve OnCheckChanged sanal yöntemi geçersiz olacaktır yapmak
+0

Sanırım, kullanıcıların tıklanması ve kod arkasında değişiklik yapmalarına bağlı olarak farklı şeyler yapmak istiyor. –

+0

Youa haklısın. – genomess

+0

Anladığım kadarıyla OP istediği şey bu; neden anlamıyorum ve ihtiyacım olan bir tasarım hatası olduğundan şüpheleniyorum –

0

One (hackish) yol. Bununla birlikte, radyo düğmeleri bir gruba ait olduğu için, olay her zaman çiftler halinde tetiklenir (onaylama için oen, kontrol için bir tane). Bu nedenle, programlı olarak seçili düğmeyi seçtiğinizde grubunun tamamını olayını bastırmak isteyeceksiniz. Bu uygulamada

public class CustomRadioButton : RadioButton 
{ 
    private bool _suppressCheckedEvent; 

    public void SetChecked(bool value, bool suppressCheckedEvent) 
    { 
     if (!suppressCheckedEvent) 
      Checked = value; 
     else 
     { 
      SetSupressModeForGroup(true); 
      Checked = value; 
      SetSupressModeForGroup(false); 
     } 
    } 

    private void SetSupressModeForGroup(bool suppressCheckedEvent) 
    { 
     foreach (var crb in Parent.Controls.OfType<CustomRadioButton>()) 
      crb._suppressCheckedEvent = suppressCheckedEvent; 
    } 

    protected override void OnCheckedChanged(EventArgs e) 
    { 
     if (!_suppressCheckedEvent) 
      base.OnCheckedChanged(e); 
    } 
} 

, etkinliği sürekli ateş edeceği Checked özelliği üzerinden kontrol-devlet değişen: Burada bir örnek uygulama bu. SetChecked yöntemini çağırdığınızda, olayı bastırmak için seçeneğiniz vardır.

2

İşte bu olayın kendisini istediğiniz gibi kullanmanın basit bir yöntemi.

private bool SuppressRadioButton1Event { get; set; } 

private void radioButton1_CheckedChanged(object sender, EventArgs e) 
{ 
    if (!this.SuppressRadioButton1Event) 
    { 
     MessageBox.Show("Not suppressed!"); 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    this.SetRadioButton1(false); 
} 

private void SetRadioButton1(bool checkedOn) 
{ 
    this.SuppressRadioButton1Event = true; 
    radioButton1.Checked = checkedOn; 
    this.SuppressRadioButton1Event = false; 
} 
+0

+1 Bu şekilde 'flagging' kelimesinin benimkinden daha iyi olduğunu itiraf etmeliyim :) –

2

çok kolay bir yolu:

public void radio_OnCheckChanged(object sender, EventArgs e) 
{ 
    RadioButton r = sender as RadioButton; 
    bool isUserChange = r.Tag.Equals(1); 
    if (isUserChange) blabla 
    else blabla 
    r.Tag = null;  
} 

public void MyMethod() 
{ 
    radio1.Tag = 1; 
    radio.Checked = true; 
} 

Kullanıcıların kendi clicking.But size kodu aracılığıyla yapabileceği tarafından yapamaz flag her türlü kullanabilirsiniz.

+0

Etiketi null yerine başka bir işaretle ayarlamak null kullanım istisnasından kaçınacaktır. – amalgamate

6

CheckedChanged olayının tasarımını alt etmeyi deneyin. Programatik değişiklikleri içermesi gerekiyor.

Kullanıcı tarafından tetiklenen değişiklikler ve programatik değişiklikler istemiyorsanız, bunun yerine Click olayını kullanın. (Kendinizi fare tıklamasıyla kısıtlamak istemediğinizi düşünüyor olabilirsiniz, endişelenmeyin, bunun için bir MouseClick olayı var, Click da klavye değişimlerini de içeriyor.)

+0

İşaretli durumdan denetlenmeyen bir duruma geçtiğinde, bu bir "RadioButton" için tetiklenmez. – Ani

+0

@Ani: genomess, kullanıcının yalnızca düğmeyi tıkladığında tetiklenmesini istediğini söyledi. Eminim ki, herhangi bir radyo düğmesi kullanıcı tarafından tıklanmadığında hiç bir zaman kontrol edilmez. –

+0

Doğru, yeterince iyi. – Ani

-1

Olayı programlı olarak eklemeyi deneyebilirsiniz. . Uygulama yapılandırmamı temel alarak birkaç radyo düğmesini kontrol ediyorum ancak olayları tetiklemek istemiyorum. Program aracılığıyla bir olay eklemek için:

chbOptionX.CheckedChanged + = new System.EventHandler (this.chbShowStockBySizeAndColor_CheckedChanged);

+0

Yine de olay tetiklendiğinde, ayarlayıcı ve tıklama kaynaklı değişiklikler arasında ayrım yapamazsınız. – DerMike

İlgili konular