VB2008 ListView Ligne de couleur alternée

Résolu
Fabasia Messages postés 45 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 17 août 2012 - 4 juin 2011 à 14:18
Fabasia Messages postés 45 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 17 août 2012 - 5 juin 2011 à 16:51
J'aimerais pourvoir alterner la couleur des lignes d'un listview.

En agissant sur les propriété, ListView.Items(index).BackColor Color.xxx , ListView.Items(index).ForeColor Color.xxx ,on n'agit que sur le texe de l'item et pas sur toute ligne.

Comment faire pour colorer toute la ligne ?

En fouillant, j'ai trouvé qu'il était possible d'utiliser IValueConverter, mais a chaque fois il y a du code en XAML. Peut-on utiliser du XAML en VB (pas WPF) et si oui comment faire ?

Peut-être une autre méthode ?

Merci

4 réponses

Utilisateur anonyme
5 juin 2011 à 00:00
Salut,
La propriété OwnerDraw du contrôle ListView devrait être mise sur True.
Ensuite, on se sert des événements DrawItem, DrawSubItem et DrawColumnHeader pour des dessins personnalisés sur la ListView.
On ajoute aussi une petite variable que l'on incrémente et dont on teste le modulo pour alterner les couleurs de la ligne.
Pour illustrer ce commentaire, voici un petit exemple :
Public Class Form1
    Dim alterne As Integer

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim strItem() As String = {"tata", "titi", "toto", "tutu"}
        Dim strSubItem() As String = {"mama", "mimi", "momo", "mumu"}
        With ListView1
            .View = View.Details
            .OwnerDraw = True
            .Columns.Add("T", 200, HorizontalAlignment.Left)
            .Columns.Add("M", 200, HorizontalAlignment.Left)
            For x = 0 To strItem.Length - 1
                Dim item As New ListViewItem(strItem(x))
                item.SubItems.Add(strSubItem(x))
                .Items.Add(item)
            Next
        End With
    End Sub

    Private Sub ListView1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewItemEventArgs) Handles ListView1.DrawItem
        alterne += 1
        If alterne Mod 2 = 0 Then
            e.Graphics.FillRectangle(Brushes.CornflowerBlue, e.Bounds)
        Else
            e.Graphics.FillRectangle(Brushes.SteelBlue, e.Bounds)
        End If
        e.DrawText()
    End Sub

    Private Sub ListView1_DrawSubItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewSubItemEventArgs) Handles ListView1.DrawSubItem
        If alterne Mod 2 = 0 Then
            e.Graphics.FillRectangle(Brushes.CornflowerBlue, e.Bounds)
        Else
            e.Graphics.FillRectangle(Brushes.SteelBlue, e.Bounds)
        End If
        e.DrawText()
    End Sub

    Private Sub ListView1_DrawColumnHeader(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
        e.DrawDefault = True
    End Sub
End Class

Bonne soirée.
3
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
5 juin 2011 à 00:14
Salut,
Voici le code en c#, il reste a l'adapté.

((e.ItemIndex & 1) 0 --> (e.ItemIndex Mod 2 0)

protected override void OnDrawItem(DrawListViewItemEventArgs e)
{

if ((e.ItemIndex & 1)==0 )
{
e.Item.BackColor = m_BackGroundStripe1Colour;
}
else
{
e.Item.BackColor = m_BackGroundStripe2Colour;
}

e.DrawDefault = true;
}
3
Utilisateur anonyme
5 juin 2011 à 00:37
Ah oui tiens j'avais pas pensé a ItemIndex ce qui rend ma variable "alterne" inutile. Merci nhervagault
0
Fabasia Messages postés 45 Date d'inscription mercredi 26 mars 2008 Statut Membre Dernière intervention 17 août 2012
5 juin 2011 à 16:51
Meci à tous les 2
0
Rejoignez-nous