2008-12-02 12 views
13

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

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

उत्तर

11

यह आपके द्वारा अभी भी बिंदीदार रेखा बिट प्राप्त करने के अलावा करेगा।

this.checkedListBox1.SelectionMode = System.Windows.Forms.SelectionMode.None; 

हालांकि अब आप चेक बॉक्स क्लिक नहीं कर सकते ... इसलिए तुम इतनी तरह कुछ करना होगा:

private void checkedListBox1_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < checkedListBox1.Items.Count; i++) 
     { 


      if (checkedListBox1.GetItemRectangle(i).Contains(checkedListBox1.PointToClient(MousePosition))) 
      { 
       switch (checkedListBox1.GetItemCheckState(i)) 
       { 
        case CheckState.Checked: 
         checkedListBox1.SetItemCheckState(i, CheckState.Unchecked); 
         break; 
        case CheckState.Indeterminate: 
        case CheckState.Unchecked: 
         checkedListBox1.SetItemCheckState(i, CheckState.Checked); 
         break; 
       } 

      } 

     } 
    } 

सब करता है, तो है कि नहीं है के बाद अपने आप क्या .. हमेशा अपना खुद का बना सकते हैं। यह एक काफी सरल नियंत्रण है।

+3

यह की तरह लगता है होगा MouseDown हैंडलर में checkListBox1.IndexFromPoint (ex, ey) का उपयोग करने के लिए और अधिक कुशल बनें, इसके बजाय ओ GetItemRectangle परिणामों के माध्यम से f looping। – Eyal

7

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

public partial class EnhancedCheckedListBox : CheckedListBox 
{ 
    /// <summary>Overrides the OnDrawItem for the CheckedListBox so that we can customize how the items are drawn.</summary> 
    /// <param name="e">The System.Windows.Forms.DrawItemEventArgs object with the details</param> 
    /// <remarks>A CheckedListBox can only have one item selected at a time and it's always the item in focus. 
    /// So, don't draw an item as selected since the selection colors are hideous. 
    /// Just use the focus rect to indicate the selected item.</remarks> 
    protected override void OnDrawItem(DrawItemEventArgs e) 
    { 
     Color foreColor = this.ForeColor; 
     Color backColor = this.BackColor; 

     DrawItemState s2 = e.State; 

     //If the item is in focus, then it should always have the focus rect. 
     //Sometimes it comes in with Focus and NoFocusRect. 
     //This is annoying and the user can't tell where their focus is, so give it the rect. 
     if ((s2 & DrawItemState.Focus) == DrawItemState.Focus) 
     { 
      s2 &= ~DrawItemState.NoFocusRect; 
     } 

     //Turn off the selected state. Note that the color has to be overridden as well, but I just did that for all drawing since I want them to match. 
     if ((s2 & DrawItemState.Selected) == DrawItemState.Selected) 
     { 
      s2 &= ~DrawItemState.Selected; 

     } 

     //Console.WriteLine("Draw " + e.Bounds + e.State + " --> " + s2); 

     //Compile the new drawing args and let the base draw the item. 
     DrawItemEventArgs e2 = new DrawItemEventArgs(e.Graphics, e.Font, e.Bounds, e.Index, s2, foreColor, backColor); 
     base.OnDrawItem(e2); 
    } 
} 
+0

मुझे इस समाधान से प्यार है, लेकिन एक मामूली चिमटा के बिना यह मेरे 'फॉर्म 1.cs [डिज़ाइन] 'क्रैश को देखने का कारण बन रहा था।पूरे विधि ब्लॉक के चारों ओर एक सरल प्रयास/पकड़ जोड़ना, निम्नलिखित कोड ने मेरे लिए समस्या तय की है और अब यह खूबसूरती से काम कर रहा है: 'पकड़ (अपवाद) {base.OnDrawItem (e); } ' – Michael

21

निम्नलिखित का उपयोग करें:

private void checkedListBox1__SelectedIndexChanged(object sender, EventArgs e) 
     { 
      checkedListBox1.ClearSelected(); 
     } 
+0

शानदार ढंग से सरल। – KoZm0kNoT

+0

लेकिन यह आइटम को चेक/अनचेक करने से रोक देगा ... – horgh

+0

टैंक यह मुझे पागल कर रहा है। ऐसा लगता है कि चेक किए गए सूची बॉक्स में कई चयन राज्य हैं .. यह डिफ़ॉल्ट के रूप में क्यों चाहते हैं ?! –

0

उह शांत एक

checkedListBox1_MouseMove(object sender, MouseEventArgs e) 

में डाल सब हाथ से जवाब से कोड जोड़ने में जोड़ देते हैं तो स्विच

करने के लिए माउस बटन बिट
case CheckState.Checked: 
    if (e.Button == MouseButtons.Right) 
    { 
     checkedListBox1.SetItemCheckState(i, CheckState.Unchecked); 
    }      
    break; 

ए nd

case CheckState.Unchecked: 
    if (e.Button == MouseButtons.Left) 
    { 
     checkedListBox1.SetItemCheckState(i, CheckState.Checked); 
    } 
    break; 

और के रूप में आप के बाएं बटन से माउस ले जाते हैं यह प्रकाश डाला आइटम की जाँच करेगा दबाया और उन्हें सही

0

साथ अन-प्रकाश डाला मैं एक छोटे से यहाँ एक जवाब देने के लिए देर से कर रहा हूँ। वैसे भी, इस होगा अचिह्नित सभी चेक बॉक्स और पर प्रकाश डाला प्रभाव को दूर:

foreach (int i in clb.CheckedIndices) //clb is your checkListBox 
    clb.SetItemCheckState(i, CheckState.Unchecked); 
clb.SelectionMode = System.Windows.Forms.SelectionMode.None; 
clb.SelectionMode = System.Windows.Forms.SelectionMode.One; 
  • सभी अनचेक करें चेक बॉक्स
  • अक्षम checkListBox के चयन
  • checkListBox के चयन सक्षम
संबंधित मुद्दे

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