2010-12-15 20 views
25

ListView नियंत्रण एक ItemCheck घटना है जो से पहले आइटम परिवर्तन निकाल दिया जाता है, और एक घटना है कि आइटम परिवर्तन के बाद निकाल दिया जाता है ItemChecked। अधिक जानकारी के लिए this SO question देखें।कोई आइटम चेक किए गए ईवेंट में चेक किए गए ईवेंट में?

चेकडलिस्टबॉक्स नियंत्रण में केवल आइटम चेक ईवेंट है।

चेकडलिस्टबॉक्स के साथ ऐसा कुछ करने का सबसे अच्छा तरीका क्या है?

private void checkedListBox_ItemChecked(object sender ItemCheckedEventArgs e) 
{ 
    okButton.Enabled = (checkedListBox.CheckedItems.Count > 0); 
} 

पूरक प्रश्न: क्यों कोई CheckedListBox.ItemChecked घटना है?

+1

संभव डुप्लिकेट [के बाद एक आइटम को चेक किया गया कौन सा CheckedListBox ईवेंट ट्रिगर करता है?] (Http://stackoverflow.com/questions/3666682/which-checkedlistbox-event-triggers-after-a-item-is- चेक किया गया) – taocp

उत्तर

47

उन घटनाओं से निपटने के लिए एक अच्छी चाल जो आप उठाए जाने पर संसाधित नहीं कर सकते हैं, प्रक्रिया में देरी करना है। आप Control.BeginInvoke() विधि के साथ क्या कर सकते हैं, जैसे ही सभी ईवेंट प्रेषित होते हैं, यह दुष्प्रभाव पूर्ण हो जाता है और UI थ्रेड फिर से निष्क्रिय हो जाता है। अक्सर TreeView के लिए भी सहायक, एक और क्रैकी नियंत्रण।

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) { 
     this.BeginInvoke((MethodInvoker)delegate { 
      okButton.Enabled = checkedListBox1.CheckedItems.Count > 0; 
     }); 
    } 

बस मामले में: इसमें थ्रेडिंग के साथ कुछ भी नहीं है और चाल काफी सस्ता है।

कोई आइटम चेक क्यों नहीं किया गया? पक्का नहीं है। चेकड लिस्टबॉक्स सिर्फ एक बहुत अच्छा नियंत्रण नहीं है। मूल विनफॉर्म टीम में गुरुओं में से एक द्वारा निश्चित रूप से नहीं किया जाता है।

+0

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

+3

एक छोटा सा झगड़ा। "जब तक विंडो हैंडल नहीं बनाया जाता है तब तक BeginInvoke को नियंत्रण में नहीं बुलाया जा सकता", और मैं फॉर्म को दिखाने से पहले चेकलिस्ट Box1.SetItem चेक किए गए() के माध्यम से राज्य स्थापित कर रहा था, जो अपवाद फेंकता है। –

+1

चूहे, आपको एक छेड़छाड़ मिली। इसका परीक्षण करें। IHandleCreated या कोड को लोड ईवेंट में ले जाएं या ईवेंट को तब तक सब्सक्राइब न करें जब तक आप आइटम प्रारंभ नहीं कर लेते। मैं लोड इवेंट (ऑनलोड, वास्तव में) का पक्ष लेगा। –

4
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) { 
     int count = this.checkedListBox1.CheckedItems.Count; 
     if (e.CurrentValue != CheckState.Checked && e.NewValue == CheckState.Checked) { 
      count += 1; 
     } else if (e.CurrentValue == CheckState.Checked && e.NewValue != CheckState.Checked) { 
      count -= 1; 
     } 
     this.okButton.Enabled = count > 0; 
    } 
0

मैं इस समस्या को हल करने के लिए टाइमर का उपयोग करता हूं। ItemCheck ईवेंट के माध्यम से टाइमर सक्षम करें। टाइमर की टिक घटना में कार्रवाई करें।

यह काम करता है कि आइटम माउस क्लिक के माध्यम से या स्पेस-बार दबाकर चेक किया गया है या नहीं। हम इस तथ्य का लाभ उठाएंगे कि जिस आइटम ने अभी चेक किया है (या अन-चेक किया गया है) हमेशा चयनित आइटम है।

टाइमर का अंतराल 1 जितना कम हो सकता है। जब तक टिक ईवेंट उठाया जाता है, तब तक नई जांच की गई स्थिति सेट की जाएगी।

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

सूची में आइटम का अनुक्रमिक पास करें या उचित कार्रवाई करने के लिए इसके चेक किए गए आइटम्स संग्रह का उपयोग करें।

यही कारण है कि हम पहले आइटमशेक ईवेंट में टाइमर को अक्षम करते हैं। अक्षम करें सक्षम करें अंतराल अवधि को फिर से शुरू करने का कारण बनता है।

Private Sub ckl_ItemCheck(ByVal sender As Object, _ 
          ByVal e As System.Windows.Forms.ItemCheckEventArgs) _ 
     Handles ckl.ItemCheck 

tmr.Enabled = False 
tmr.Enabled = True 

End Sub 


Private Sub tmr_Tick(ByVal sender As System.Object, _ 
        ByVal e As System.EventArgs) _ 
Handles tmr.Tick 

tmr.Enabled = False 
Debug.Write(ckl.SelectedIndex) 
Debug.Write(": ") 
Debug.WriteLine(ckl.GetItemChecked(ckl.SelectedIndex).ToString) 

End Sub 
0

पर Hans Passant's answer आधार पर मैं एक सामान्य VB.NET संस्करण जोड़ रहा हूँ। मुझे एक विधि की आवश्यकता थी जिसे फ़ॉर्म पर सभी चेकडलिस्टबॉक्स नियंत्रणों के लिए बुलाया जाएगा। यदि आपको प्रत्येक नियंत्रण के लिए अलग-अलग तरीकों की आवश्यकता है तो आप आसानी से इसे ट्वीक कर सकते हैं (यद्यपि कुछ अनावश्यकता जोड़ता है)।

Public Class Form1 
    Delegate Sub ProcessItemCheck(ByRef ListBoxObject As CheckedListBox) 

    Private Sub ProcessItemCheckSub(ByRef ListBoxObject As CheckedListBox) 
     ' Do your actual ItemCheck stuff here 
    End Sub 

    Private Sub CheckedListBox1_ItemCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck 
     Dim Objects As Object() = {CheckedListBox1} 
     BeginInvoke(New ProcessItemCheck(AddressOf ProcessItemCheckSub), Objects) 
    End Sub 
End Class 
की
संबंधित मुद्दे

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