2013-05-06 4 views
2

Après une recherche un peu, je n'ai pas rencontré ma question spécifique.Supprimer la surbrillance et ajouter la bordure de sélection dans WinForms ListView C#

Je voudrais changer le comportement par défaut de la sélection ListView sur un WinForm en C#

que je dois faire cela parce que je suis en utilisant des couleurs personnalisées dans les cellules pour représenter necessecary méta-informations à l'utilisateur.

(J'utilise la sélection d'une seule ligne seulement, à savoir MutiSelect = false;)

Lorsque je sélectionne une ligne dans une ListView la ligne entière est highlighed bleu par défaut,

Selected Row with Blue Background

Au lieu de cela, je voudrais savoir,

Comment est-ce que je peux souligner la bordure de la rangée et ne pas changer la couleur (s) des cellules dans la rangée?

Comme on le voit dans ce qui suit

Selected Row without Blue Background and dotted line

Répondre

0

Il n'y a aucun moyen de le faire, la seule façon de supprimer la mise en avant est de créer un listview personnalisé vous et passer outre la façon dont l'élément sélectionné est dessiné.

EDIT:

donnent cette classe un essai:

public class NativeListView : System.Windows.Forms.ListView 
{ 
    [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)] 
    private extern static int SetWindowTheme(IntPtr hWnd, string pszSubAppName, 
             string pszSubIdList); 

    protected override void CreateHandle() 
    { 
     base.CreateHandle(); 

     SetWindowTheme(this.Handle, "explorer", null); 
    } 
} 
+0

en êtes-vous sûr? cet utilisateur a le problème inverse. http://stackoverflow.com/questions/9642281/listview-selection-rectangle. –

+0

Non, il a la même chose, il veut aussi changer son look de sélection à quelque chose d'autre (style Windows Explorer dans ce cas), vous voulez le rendre transparent et juste mettre en évidence les frontières. – Max

+0

Bien dans tous les cas, le "rectangle de sélection" apparaît sur cette question, alors qu'il n'est pas présent sur mes tests C#/listview. Si un "rectangle de sélection" peut être affiché, je peux remplacer les autres aspects de la coloration des lignes. –

2

Oui, ListView prend en charge le dessin personnalisé en définissant la propriété OwnerDraw True. Cela tend à être complexe mais vos besoins sont simples, vous pouvez utiliser beaucoup de dessin par défaut ici. Ce n'est que lorsqu'un élément est sélectionné que vous avez besoin de quelque chose de différent. La classe ControlPaint peut dessiner le rectangle pointillé que vous voulez. Implémentez les trois gestionnaires d'événements Draw, quelque chose comme ceci:

private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) { 
     e.DrawDefault = true; 
    } 

    private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) { 
     e.DrawBackground(); 
     e.DrawText(); 
     if ((e.State & ListViewItemStates.Selected) == ListViewItemStates.Selected) { 
      var bounds = e.Bounds; 
      bounds.Inflate(-1, -1); 
      ControlPaint.DrawFocusRectangle(e.Graphics, bounds); 
     } 
    } 

    private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) { 
     e.DrawBackground(); 
     e.DrawText(); 
     if ((e.ItemState & ListViewItemStates.Selected) == ListViewItemStates.Selected) { 
      var bounds = e.Bounds; 
      bounds.Inflate(-1, -1); 
      ControlPaint.DrawFocusRectangle(e.Graphics, bounds); 
     } 
    } 

Modifiez comme vous le souhaitez. Notez que vous souhaitez probablement également implémenter l'événement MouseDown afin que l'utilisateur puisse cliquer sur n'importe quel sous-élément et sélectionner la ligne. Il n'est plus clair que cela se comporte comme un ListView. Utilisez la méthode HitTest() pour l'implémenter.

+0

Merci, je vais essayer ça. –

+0

Cela fonctionne mais j'ai une erreur étrange. Lorsque vous passez la souris sur une rangée pour la première fois sans cliquer, juste après que la fonction 'e.DrawText()' est appelée dans 'listView1_DrawItem()', les autres sous-éléments disparaissent. La seule chose qui reste est la première colonne. Cela ne se produit plus après avoir cliqué une fois sur une ligne. Aucune suggestion? –

+0

Aucune idée. Je suspecte une exception, regardez dans la fenêtre de sortie. –

Questions connexes