2010-07-05 16 views
5

मैं वर्तमान में एक विंडो ऐप विकसित कर रहा हूं जो प्रोग्राम के कुछ पहलुओं के लिए चेकडलिस्टबॉक्स का उपयोग करता है। एक समस्या का सामना करना पड़ा है कि मैं यह पता लगाने की कोशिश कर रहा हूं कि कोई आइटम चेक किए जाने पर कौन सा ईवेंट ट्रिगर होता है ताकि जब कोई सूची आइटम चेक किया जाए तो मैं फॉर्म बटन सक्षम कर सकता हूं।विंडोज सी # चेकड लिस्टबॉक्स चेक किए गए आइटम इवेंट हैंडलिंग

समस्या यह है कि मैंने निम्न का उपयोग करने का प्रयास किया;

private void clbAvailMods_ItemCheck(object sender, ItemCheckEventArgs e) 
    { 
     if(e.NewValue == CheckState.Checked) 
     { 
      btnInstall.Enabled = true; 
     } 
    } 

लेकिन जब मैं if स्टेटमेंट पर ब्रेकपॉइंट सेट करता हूं, तो यह सूची बॉक्स में किसी आइटम को चेक करने पर कभी भी आग नहीं लगाता है।

क्या मैं यहां कुछ गलत कर रहा हूं?

+0

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

उत्तर

18

एक मानक विंडोज फॉर्म की चाल चलने वाले कोड में देरी करना है जब तक कि सभी घटना दुष्प्रभाव पूर्ण नहीं हो जाते। आप Control.BeginInvoke() विधि के साथ चल रहे कोड में देरी करते हैं। आप मैन्युअल रूप से CheckedItems.Count अद्यतन करने के लिए NEWVALUE संपत्ति का उपयोग कर सकते

private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e) { 
     this.BeginInvoke(new MethodInvoker(evalList), null); 
    } 

    private void evalList() { 
     bool any = false; 
     for (int ix = 0; ix < checkedListBox1.Items.Count; ++ix) { 
      if (checkedListBox1.GetItemChecked(ix)) { 
       any = true; 
       break; 
      } 
     } 
     btnInstall.Enabled = any; 
    } 
+0

मैं निश्चित रूप से इस सुझाव को और अधिक देख रहा हूं। ऐसा लगता है कि पेपर (स्क्रीन) पर सही रास्ते पर है। :) धन्यवाद, हंस। –

+0

मुझे लगता है कि वह टिकट बनने जा रहा है जिसे मैं ढूंढ रहा था। सहायता के लिए धन्यवाद! :) –

+0

यह मेरे लिए संयोजन dodgy_coder समाधान के साथ काम किया: http://stackoverflow.com/questions/545533/delayed- समारोह- कॉल। बस अपने कोड में foo विधि जोड़ें, फिर इस पंक्ति को इस में बदलें। BginginInvoke (नया MethodInvoker (foo), null); और आखिर में बार के अंदर foo कॉल evalList के अंदर कॉल(); –

0

कुछ संभावित गेटचास। संभवतः आपने यह सुनिश्चित करने के लिए VS.Net GUI के माध्यम से ईवेंट जोड़ा है कि यह नियंत्रण में गिर जाता है। किसी आइटम पर दो बार क्लिक करने का प्रयास करें - एक बार आइटम फोकस देने के लिए और फिर चेक स्थिति को टॉगल करने के लिए - यदि आप किसी आइटम को अपनी चेक स्थिति को पहले क्लिक पर टॉगल करना चाहते हैं तो "चेकऑनक्लिक" संपत्ति को सत्य पर सेट करें।

+0

मेरे पास पहले से ही "CheckOnClick" मान सेट है। मैंने देखा कि माइक्रोस्कोन लगता है कि उन्होंने इस मामले में एक महत्वपूर्ण डिजाइन तत्व को नजरअंदाज कर दिया है। वे आपको यह बदलने देंगे कि परिवर्तन क्या हो रहा है, लेकिन बदलाव पूरा होने के बाद किसी भी घटना को ट्रिगर नहीं किया जाता है। मुझे कहना होगा कि एमएस में उन मूर्खों को गीले सपने के लिए डीबगर की आवश्यकता हो सकती है। –

0

मुझे लगता है कि यह चयनित इंडेक्स चेंज किया गया ईवेंट है लेकिन मैं अभी पुष्टि करूंगा।

संपादित करें: चयनित इंडेक्स चेंज किया गया ईवेंट काम करता है। लेकिन यह जांच कर रहा है कि चेकबॉक्स की जांच की गई थी या नहीं। तो यदि आप ऐसा करना चाहते हैं तो मैं चेक किए गए राज्य की जांच करूंगा।

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

+0

हां, जब आप चेकबॉक्स पर क्लिक करते हैं तो आइटम चेक आग लगती है। वास्तविक समस्या यह है कि उस चेकबॉक्स की जांच की गई स्थिति अभी भी उस पर विपरीत होगी जो आइटमशेक प्रसंस्करण समाप्त होने तक इसे क्लिक करने से पहले थी। इसलिए, यह देखने का प्रयास करने का सही दुविधा है कि वास्तव में चेकबॉक्स वास्तव में चेक किया गया है या रीयलटाइम में अनचेक किया गया है। अर्थात।"ItemCheckChanged" ईवेंट की आवश्यकता। –

+0

तो क्या आप सिर्फ विपरीत की जांच नहीं कर सकते? यदि आइटम चेक ईवेंट फायरिंग हो रहा है और चेकबॉक्स चेक नहीं किया गया है तो इसका मतलब है कि यह सही जांचने वाला है? – spinon

2

: यह आपकी समस्या का समाधान होगा। इस कोड मैं करने के लिए उपयोग जब वहाँ कम से कम एक आइटम की जाँच की है केवल एक बटन को सक्षम है:

private void checkedListBoxProds_ItemCheck(object sender, ItemCheckEventArgs e) 
{ 
    this.buttonGenerar.Enabled = ((this.checkedListBoxProds.CheckedItems.Count + (e.NewValue == CheckState.Checked ? 1 : -1)) > 0); 
} 
0

मैं जानता हूँ कि यह बहुत पहले उत्तर दिया गया है, लेकिन मैं यह आसान सिर्फ MouseUp और KeyUp ईवेंट प्रबंधित करने के पाया। CheckedItems.Count प्रॉपर्टी सटीक होती है जब उन घटनाओं को निकाल दिया जाता है। चूंकि वे दोनों एक ही काम करते हैं, इसलिए मैंने काम करने के लिए एक विधि बनाई और दोनों ईवेंट हैंडलर से उस विधि को बुलाया।

private void clbFolders_KeyUp(object sender, KeyEventArgs e) { Update(); } 
private void clbFolders_MouseUp(object sender, MouseEventArgs e) { Update(); } 

private void Update() 
{ 
    btnDelete.Enabled = clbFolders.CheckedItems.Count > 0; 
} 
संबंधित मुद्दे