2011-11-11 17 views
26

प्रोग्रामेटिक रूप से नियंत्रण की जांच करते समय मैं चेक किए गए चेंज किए गए ईवेंट को फायरिंग कैसे रोकूं?फायरिंग को कैसे रोकें चेक किए गए चेंज किए गए ईवेंट को प्रोग्रामेटिक रूप से नियंत्रित करते समय?

मैं आमतौर पर इसे निम्न तरीके से करता हूं।

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 
} 

क्या कोई बेहतर या अधिक सामान्य समाधान है?

+1

यह सही तरीका है। तकनीकी रूप से आपको अंततः ब्लॉक में झूठ बोलना चाहिए। –

उत्तर

40

मुझे लगता है कि आपका रास्ता ठीक है।

ऐसा करने का दूसरा तरीका चेक से पहले EventHandler को हटा दें, और उसके बाद चेक के बाद इसे फिर से जोड़ें। इस तरह isFrozen चर की आवश्यकता को समाप्त करता है।

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

अच्छा विचार। मैंने कभी घटनाओं को हटाने के बारे में सोचा नहीं है। – Zenya

+0

अच्छा सरल समाधान लार्स – WraithNath

+1

इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए। भले ही इस कार्य को ओपी के दृष्टिकोण के रूप में कोई फर्क नहीं पड़ता है, यह व्यक्तित्व इरादा एक बहुत ही स्पष्ट तरीका है, इसलिए अगला कोड जो इस कोड पर काम करता है, स्पष्ट रूप से समझ सकता है कि क्या किया जा रहा है और क्यों, बिना किसी टिप्पणी के इसे भी समझाया जा सकता है। – Jim

5

वीबी में:

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

उत्तर सी # नहीं वीबी के बारे में था। –

+4

लेकिन यह हम में से कुछ के लिए उपयोगी है जिन्होंने सी # (हमारी पहली भाषा) में ऐसा करने के बारे में सोचा था, लेकिन वीबीनेट (क्लाइंट के अनुरोध) में कोड लिखना पड़ा। –

+0

जबकि मैंने इस उत्तर की बहुत सराहना की, मुझे लगता है कि इसे स्वीकृत उत्तर पर टिप्पणी के रूप में जोड़ा जाना चाहिए। – Eric

4

मैं थोड़ी देर के लिए कुछ इस तरह लागू करने के लिए इच्छुक के बाद इस पोस्ट भर में आया था। मैं नियमित रूप से राष्ट्रीय उपकरण से मापन स्टूडियो का उपयोग करता हूं, और उनके विनफॉर्म नियंत्रण करता है जिसमें ईवेंट स्टेट चेंजिंग या स्टेट चेंजेड एक्शनएवेंट आर्ट्स के पैरामीटर को पास करता है, जिसमें एक संपत्ति क्रिया होती है जो तीन मान ले सकती है: ByKeyboard, ByMouse और Programatic। यह निर्धारित करने में बहुत उपयोगी है कि नियंत्रण की स्थिति को बदलने के कारण क्या हुआ है। मैं इसे एक मानक WinForms चेकबॉक्स में दोहराना चाहता था।

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; 
    } 
} 

मुझे यकीन है कि वहाँ कई सुधार कर रहे हैं, लेकिन मेरी प्रारंभिक परीक्षण का प्रदर्शन किया है कि यह काम करता है:

यहाँ मेरी कोड है। मैंने यहां पोस्ट किया है अगर अन्य इस मुद्दे पर ठोकर खाएंगे और बदलाव की शुरुआत की गई थी, जहां अंतर की एक स्पष्ट तरीका चाहिए। कोई टिप्पणी स्वागत है।

संबंधित मुद्दे

 संबंधित मुद्दे