2008-12-02 2 views
13

Lorsqu'un élément est cliqué dans la liste de contrôle, il est surligné. Comment puis-je empêcher cet effet de surbrillance?Comment se débarrasser de l'effet de surélévation de la sélection checklistbox?

Je peux accrocher dans l'événement SelectedIndexChanged et effacer la sélection, mais la surbrillance se produit toujours et vous voyez un blip. En fait, si vous maintenez le bouton de la souris enfoncé, ne le relâchez jamais après avoir cliqué sur la case à cocher, la sélection reste en surbrillance jusqu'à ce que vous relâchiez le bouton de la souris. Je veux essentiellement me débarrasser complètement de cet effet de surbrillance.

Répondre

11

cela le fera en dehors de vous obtenez toujours le bit de la ligne pointillée.

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

bien que maintenant vous ne pouvez pas cliquer sur les cases à cocher ... de sorte que vous aurez à faire quelque chose comme ceci:

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

      } 

     } 
    } 

si tout ce qui est pas ce que votre après .. vous peut toujours faire votre propre. C'est un contrôle assez simple.

+3

On dirait que ce serait être plus efficace pour utiliser checkListBox1.IndexFromPoint (ex, ey) dans le gestionnaire MouseDown, à la place o f en boucle dans les résultats de GetItemRectangle. – Eyal

7

La définition du paramètre SelectionMode sur None présente des problèmes étranges, tels que l'implémentation de l'événement Click. Vous pouvez laisser le paramètre SelectionMode sur single, puis créer une classe qui redéfinit CheckedListBox avec seulement OnDrawItem. Notez que pour désactiver une apparence sélectionnée, vous devez désactiver l'état Sélectionné et définir les couleurs comme vous le souhaitez. Vous pouvez obtenir la couleur d'origine du contrôle comme je l'ai fait ici. C'est ce que je suis venu avec et devrait vous aider à le faire apparaître comme vous le souhaitez.

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

J'adore cette solution, mais sans un petit réglage mineur, cela provoquait le crash de ma vue 'Form1.cs [Design]'.Ajouter un simple try/catch autour de tout le bloc de la méthode, avec le code suivant a résolu le problème pour moi et il fonctionne maintenant magnifiquement: 'catch (Exception) {base.OnDrawItem (e); } ' – Michael

21

Utilisez les éléments suivants:

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

Brillamment simple. – KoZm0kNoT

+0

Mais cela l'empêcherait de vérifier/décocher des éléments ... – horgh

+0

des chars cela me rend fou. C'est comme si la boîte de liste vérifiée avait plusieurs états de sélection. Pourquoi voudriez-vous cela par défaut ?! –

0

ooh cool Ajouter mettre tout le code de réponse de Dieu, dans un

checkedListBox1_MouseMove(object sender, MouseEventArgs e) 

add si bit bouton de la souris pour le commutateur

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; 

et il vérifiera les éléments mis en surbrillance lorsque vous déplacez la souris avec le bouton gauche enfoncé et les non mettre en évidence le droit

0

Je suis un peu tard pour donner une réponse ici. Quoi qu'il en soit, cela décocher toutes cases à cocher et enlever la mettant en lumière effet:

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; 
  • Décocher toutes les cases de sélection de
  • Désactiver checkListBox
  • Activer la sélection de checkListBox
Questions connexes