2010-03-19 25 views
8

मेरे पास एक चेक बॉक्स है और मैंने चेक किए गए चेंज किए गए ईवेंट के लिए सदस्यता ली है। हैंडलर वहां कुछ संचालन करता है। मैं चेकबॉक्स को प्रोग्रामेटिक रूप से चेक और अनचेक करता हूं (उदा: chkbx_Name.Checked = true), और चेक किए गए चेंज किए गए ईवेंट को निकाल दिया जाता है।चेक किए गए चेंज किए गए ईवेंट में समस्या

मैं चाहता हूं कि यह ईवेंट केवल तभी निकाला जाए जब मैं मैन्युअल रूप से चेक या अनचेक करता हूं। क्या इस घटना की गोलीबारी से बचने का कोई तरीका है जब मैं इसे प्रोग्रामेटिक रूप से चेक/अनचेक करता हूं?

उत्तर

13

घटना सदस्यता समाप्त करने से पहले आप सेट:

0:

check1.CheckChanged -= check1_CheckChanged; 

तो आप प्रोग्राम मूल्य चेकबॉक्स बिना अपनी CheckChanged घटना फायरिंग सेट कर सकते हैं

तो फिर से सदस्यता ले:

check1.CheckChanged += check1_CheckChanged; 

[संपादित करें: 29 मार्च 2012]

तन्वी के दृष्टिकोण के साथ समस्या यह है कि आप पुस्तिका की जांच के सभी स्रोत पकड़ने या सही का निशान की जरूरत है। ऐसा नहीं है कि यह बहुत अधिक है (यह केवल माउस क्लिक से और उपयोगकर्ता को स्पेसबार दबाकर) है, लेकिन आपको माउसक्लिक और कीअप (स्पेसबार का पता लगाने) से एक रिफैक्टर घटना का आह्वान करना होगा

यह चेकबॉक्स के लिए अधिक साफ है (इसके लिए कोई नियंत्रण यह मामला) उपयोगकर्ता इनपुट (कीबोर्ड, माउस, आदि) के स्रोत के अज्ञेयवादी होने के लिए, इसलिए इसके लिए मैं केवल चेकबॉक्स की प्रोग्रामेटिक सेटिंग को प्रोग्रामेटिक बना दूंगा। उदाहरण के लिए, आप एक विस्तार विधि के लिए संपत्ति के कार्यक्रम संबंधी सेटिंग लपेट कर सकते हैं:

static class Helper 
{ 
    public static void SetCheckProgrammatically(
     this CheckBox c, 
     EventHandler subscribedEvent, bool b) 
    {    
     c.CheckedChanged -= subscribedEvent; // unsubscribe 
     c.Checked = b; 
     c.CheckedChanged += subscribedEvent; // subscribe 
    } 
} 

इस दृष्टिकोण का उपयोग करना, अपने कोड CheckChanged के माध्यम से केवल एक ही घटना है, अर्थात के माध्यम से दोनों उपयोगकर्ता के माउस इनपुट और कुंजीपटल इनपुट करने के लिए बड़े करीने से प्रतिक्रिया कर सकते हैं। कोड का कोई डुप्लिकेशंस नहीं है, एकाधिक घटनाओं की सदस्यता लेने की आवश्यकता नहीं है (उदाहरण के लिए कीबोर्ड, स्पेसबार दबाकर चेकबॉक्स को चेक/अनचेक करना)

+0

मुझे यह समाधान पसंद है, लेकिन यदि किसी दिए गए प्रोजेक्ट पर एकाधिक कोडर हैं तो क्या हर किसी को इस संपत्ति को बदलने पर हर बार सदस्यता लेने की आवश्यकता नहीं होगी? – Coops

+0

विस्तार गुणों, er .. एक्सटेंशन विधियों के साथ इसे लपेटें। जैसे check1.SetCheckedRaw (BooleanHere) –

5

नहीं। संपत्ति के मूल्य में परिवर्तन होने पर यह संपत्ति परिवर्तन घटनाओं को आग लगती है, भले ही यह आपके कोड द्वारा नियंत्रण कोड के अपने कोड या डाटाबेसिंग द्वारा किया गया हो। यह आमतौर पर एक ही कोड पथ है।

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

class Foo : Form { 
    private bool checkedProgrammatically = false; 

    void someMethod() { 
     // ... 
     checkedProgrammatically = true; 
     checkBox1.Checked = true; 
     checkedProgrammatically = false; 
     // ... 
    } 

    private void checkBox1_CheckChanged(object sender, EventArgs e) { 
     if (checkedProgrammatically) return; 
     // ... 
    } 
} 
0

आप मूल्य programiticaly बदलने से पहले बूलियन चर सेट कर सकते हैं, और की तुलना में जाँच checkedchanged घटना में है कि चर रीसेट

1

मुझे खेद है कि मैं यहां नए होने के कारण माइकल बुआ के जवाब पर टिप्पणी नहीं कर सकता (कोई प्रतिष्ठा नहीं), लेकिन इसके लायक होने के लिए मैं कुछ कारणों से जोहान्स रोस्सेल के अपने समाधान को दृढ़ता से पसंद करता हूं।

1) चेकप्रोग्रामैटिक वैरिएबल मेरे लिए ग्लोबल के बहुत करीब है। किसी अन्य विधि को गलती से इसे सही पर सेट करने के लिए कुछ भी नहीं है, जिससे आपके सभी ईवेंट रुक जाएंगे।

2) आप जिन घटनाओं से निपट रहे हैं, उनके आधार पर आप कई चर के साथ समाप्त हो सकते हैं। गलत को बदलना आसान होगा और परिणाम डीबग करना मुश्किल हो सकता है।

3) यह स्पष्ट है कि जब आप सदस्यता छोड़ते हैं तो फिर से सदस्यता लें। सभी तर्क ठीक है, और आपको कुछ स्थितियों के आधार पर जल्दी से बाहर निकलने के लिए अपने ईवेंट हैंडलर को बदलने की आवश्यकता नहीं है।

मैंने दोनों विधियों का व्यापक रूप से उपयोग किया है और मुझे लंबे समय तक माइकल का बहुत आसान लगता है।

1

आप माउसक्लिक ईवेंट और चेकबॉक्स की चेक की गई स्थिति के लिए उस चेक में उपयोग कर सकते हैं। इस तरह यह प्रोग्रामेटिक रूप से ट्रिगर नहीं किया जाएगा, यह केवल तभी कॉल किया जाएगा जब उपयोगकर्ता मैन्युअल रूप से चेकबॉक्स को चेक या अनचेक करता है।

+1

यदि उपयोगकर्ता स्पेसबार के माध्यम से चेकबॉक्स को चेक/अनचेक करता है तो क्या होगा? माउस से नहीं? मेरा प्रस्तावित समाधान देखें –

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

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