2008-12-02 9 views
13

Wenn ein Element in der Checklistenbox angeklickt wird, wird es markiert. Wie kann ich diesen Hervorhebungseffekt verhindern?Wie checkedlistbox Auswahl Hervorhebung Wirkung loswerden?

Ich kann in das SelectedIndexChanged-Ereignis einhaken und die Auswahl löschen, aber die Hervorhebung geschieht immer noch und Sie sehen einen Blip. Wenn Sie die Maustaste gedrückt halten und diese nach dem Anklicken des Kontrollkästchens nicht freigeben, bleibt die Auswahl hervorgehoben, bis Sie die Maustaste loslassen. Ich möchte diesen Hervorhebungseffekt grundsätzlich loswerden.

Antwort

11

Dies wird es abgesehen von Ihnen immer noch die gepunktete Linie Bit zu tun.

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

obwohl jetzt können Sie die Kontrollkästchen nicht klicken ... so dass Sie wie so etwas zu tun haben werden:

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

      } 

     } 
    } 

wenn das alles nicht, was .. Ihr nach ist Sie kann immer nur dein eigenes machen. es ist eine ziemlich einfache Kontrolle.

+3

Scheint, wie es wäre effizienter sein, checkedListBox1.IndexFromPoint (ex, ey) im MouseDown-Handler anstelle von o f Durchlaufen der GetItemRectangle-Ergebnisse. – Eyal

7

Wenn Sie den SelectionMode auf None festlegen, treten einige seltsame Probleme auf, z. B. das Click-Ereignis implementieren zu müssen. Sie können die SelectionMode-Gruppe auf Single setzen und dann eine Klasse erstellen, die die CheckedListBox nur mit OnDrawItem überschreibt. Beachten Sie, dass Sie den Selected-Status deaktivieren müssen, um eine ausgewählte Darstellung zu deaktivieren, und legen Sie die Farben so fest, wie Sie möchten. Sie können die ursprüngliche Farbe von der Steuerung erhalten, wie ich hier getan habe. Das ist, was ich mir ausgedacht habe und sollte dir helfen, es so aussehen zu lassen, wie du es willst.

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

Ich liebe diese Lösung, aber ohne einen kleinen Tweak habe ich meine 'Form1.cs [Design]' Ansicht zum Absturz gebracht.Das Hinzufügen eines einfachen try/catch um den gesamten Methodenblock mit dem folgenden Code hat das Problem für mich behoben und es funktioniert nun wunderbar: 'catch (Exception) {base.OnDrawItem (e); } ' – Michael

21

Verwenden Sie die folgenden Schritte aus:

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

Brillant einfach. – KoZm0kNoT

+0

Aber das würde verhindern, dass es Gegenstände ein-/auscheckt ... – horgh

+0

Panzer das macht mich verrückt. Es ist so, als hätte die überprüfte Listbox mehrere Auswahlzustände. Warum sollte dies als Standard gewählt werden ?! –

0

ooh kühl hinzufügen setzen alle Code Antwort von Hath in einem

checkedListBox1_MouseMove(object sender, MouseEventArgs e) 

add in, wenn Bit Maustaste in dem Schalter

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

a nd

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

und es wird die markierten Elemente überprüfen, wie Sie die Maus mit der linken Taste bewegen gedrückt und un-markieren Sie sie mit der rechten

0

Ich bin ein wenig spät eine Antwort hier zu geben. Wie auch immer, dies wird uncheck alle Kontrollkästchen und die Hervorhebung Effekt entfernen:

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; 
  • Deaktivieren Sie alle Kontrollkästchen
  • Disable CheckListBox die Auswahl
  • aktivieren CheckListBox der Auswahl