15 Stimmen

Wie kann man den Effekt der Hervorhebung der Auswahl in der Checkliste loswerden?

Wenn ein Element im Kontrollkästchen angeklickt wird, wird es hervorgehoben. Wie kann ich diesen Hervorhebungseffekt verhindern?

Ich kann in das SelectedIndexChanged-Ereignis einhaken und die Auswahl löschen, aber die Hervorhebung geschieht noch und Sie sehen einen Blip. Wenn Sie die Maustaste gedrückt halten und nicht loslassen, nachdem Sie auf das Kontrollkästchen geklickt haben, bleibt die Auswahl hervorgehoben, bis Sie die Maustaste loslassen. Ich möchte diesen Hervorhebungseffekt eigentlich ganz loswerden.

30voto

victoria Punkte 299

Verwenden Sie das Folgende:

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

13voto

Hath Punkte 12288

Das wird reichen, abgesehen davon, dass Sie noch die gepunktete Linie bekommen.

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

Allerdings können Sie jetzt nicht mehr auf die Kontrollkästchen klicken... Sie müssen also so vorgehen:

  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 das ist, was Sie suchen, können Sie immer noch Ihren eigenen machen. es ist eine ziemlich einfache Steuerung.

7voto

Mark Punkte 71

Die Einstellung des SelectionMode auf None hat einige seltsame Probleme wie das Click-Ereignis zu implementieren. Sie können den SelectionMode auf Single gesetzt lassen und dann eine Klasse erstellen, die die CheckedListBox nur mit OnDrawItem überschreibt. Beachten Sie, dass Sie, um ein ausgewähltes Erscheinungsbild zu deaktivieren, den Selected-Status deaktivieren und die Farben auf die gewünschten Werte setzen müssen. Sie können die ursprüngliche Farbe aus dem Steuerelement abrufen, wie ich es hier getan habe. Das ist das, was ich mir ausgedacht habe, und es sollte Ihnen helfen, es so aussehen zu lassen, wie Sie es wollen.

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

0voto

Trilby_Rob Punkte 1

Ooh cool hinzufügen den gesamten Code aus der Antwort von Hath in eine

 checkedListBox1_MouseMove(object sender, MouseEventArgs e)

Hinzufügen eines Bits für die Maustaste in den Schalter

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

y

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

und prüft die markierten Elemente, wenn Sie die Maus mit gedrückter linker Taste bewegen und hebt die Markierung mit der rechten Taste

0voto

user3437460 Punkte 16767

Ich bin ein wenig spät dran, um hier eine Antwort zu geben. Wie auch immer, dies wird alles abwählen Kontrollkästchen und entfernen Sie die Hervorhebung Wirkung:

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
  • Die Auswahl der checkListBox deaktivieren
  • Die Auswahl der checkListBox aktivieren

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X