none
remplacer checkbox dans listview1 par des images RRS feed

  • Question

  • Bonjour,

    voici en image :

    voici la deuxième image avec OwnerDraw = activer :

    voici mon code :

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    
            With ListView1
                .Columns.Add("", 25)
                .Columns.Add("couleur", 365, HorizontalAlignment.Center)
                .OwnerDraw = False
                Dim list() As String = New String() {"Rouge", "bleu", "vert", "noir", "blanc", "jaune"}
                For i = 0 To list.Count - 1
                    Dim item1 As New ListViewItem
                    item1.SubItems.Add(list(i))
                    ListView1.Items.Add(item1)
                Next i
            End With
        End Sub
    
        Private Sub ListView1_DrawSubItem(sender As System.Object, e As System.Windows.Forms.DrawListViewSubItemEventArgs) Handles ListView1.DrawSubItem
            Dim G As Graphics = e.Graphics
            Select Case e.ColumnIndex
                Case 0
                    If e.Item.Checked = False Then
                        Dim CenterX As Integer = CInt(e.Bounds.Width / 2 - My.Resources.cancel.Width / 2) + e.Bounds.Left
                        Dim CenterY As Integer = CInt(e.Bounds.Height / 2 - My.Resources.cancel.Height / 2) + e.Bounds.Top
                        G.DrawImage(My.Resources.cancel, CenterX, CenterY)
                    Else
                        Dim CenterX As Integer = CInt(e.Bounds.Width / 2 - My.Resources.Yes.Width / 2) + e.Bounds.Left
                        Dim CenterY As Integer = CInt(e.Bounds.Height / 2 - My.Resources.Yes.Height / 2) + e.Bounds.Top
                        G.DrawImage(My.Resources.Yes, CenterX, CenterY)
                    End If
            End Select
        End Sub

    quand je désactive OwnerDraw les images s'affiche pas a la place des checkboxs dans listview1 et quand j'active OwnerDraw les image affiche mais tous qui est dans form1_load s'affiche pas.

    je voudrais savoir comment on fait pour afficher les images a la place checkbox dans listview1?

    Merci de votre compréhension,

    jeudi 12 mai 2016 14:56

Réponses

  • Ce que vous cherchez est .StateImageList.

    Par exemple:

    et le code:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Me.Location = New Point(100, 100)
            ''Définition de la structure du ListView
            With ListView1
                .Columns.Add("Checkboxes?", 200)
                .Columns.Add("Couleur", 200)
                .View = View.Details
                .CheckBoxes = True
                'Préparer les images utilisées à la place de la checkbox uncheck=0 checked=1
                ' Une ImageListe est utilisée pour contenir les images
                Dim imageListCheckBoxes As New ImageList()
    
                '' Les images ont été mises dans les Resources de la solution
                imageListCheckBoxes.Images.Add(My.Resources.Unchecked)
                imageListCheckBoxes.Images.Add(My.Resources.Checked) 'Cela pourrait aussi être Bitmap.FromFile(Path & "UnFichier.bmp")
                
                ''L'ImageList est données à la ListView
                ListView1.StateImageList = imageListCheckBoxes
                
            End With
            'AJout d'éléments dans le Listview
            For intIndex = 0 To 10
                Dim unListViewItem As ListViewItem
                unListViewItem = New ListViewItem(intIndex)
                ListView1.Items.Add(unListViewItem)
                ListView1.Items(intIndex).SubItems.Add(intIndex) 'unRandom.Next(1, 300))
            Next
    
    
    
        End Sub

    • Marqué comme réponse zorro591 dimanche 15 mai 2016 14:52
    vendredi 13 mai 2016 08:03

Toutes les réponses

  • Bonjour,

    Je crois que le mieux est d'utiliser une ImageList (Composants) et ensuite lier la listview et la liste.

    De mémoire... :

    Listview1.SmallImageList = ImageList1


    Jacques
    Si la réponse vous satisfait, n'oubliez pas de la proposer comme réponse. Merci

    jeudi 12 mai 2016 21:46
  • Ce que vous cherchez est .StateImageList.

    Par exemple:

    et le code:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Me.Location = New Point(100, 100)
            ''Définition de la structure du ListView
            With ListView1
                .Columns.Add("Checkboxes?", 200)
                .Columns.Add("Couleur", 200)
                .View = View.Details
                .CheckBoxes = True
                'Préparer les images utilisées à la place de la checkbox uncheck=0 checked=1
                ' Une ImageListe est utilisée pour contenir les images
                Dim imageListCheckBoxes As New ImageList()
    
                '' Les images ont été mises dans les Resources de la solution
                imageListCheckBoxes.Images.Add(My.Resources.Unchecked)
                imageListCheckBoxes.Images.Add(My.Resources.Checked) 'Cela pourrait aussi être Bitmap.FromFile(Path & "UnFichier.bmp")
                
                ''L'ImageList est données à la ListView
                ListView1.StateImageList = imageListCheckBoxes
                
            End With
            'AJout d'éléments dans le Listview
            For intIndex = 0 To 10
                Dim unListViewItem As ListViewItem
                unListViewItem = New ListViewItem(intIndex)
                ListView1.Items.Add(unListViewItem)
                ListView1.Items(intIndex).SubItems.Add(intIndex) 'unRandom.Next(1, 300))
            Next
    
    
    
        End Sub

    • Marqué comme réponse zorro591 dimanche 15 mai 2016 14:52
    vendredi 13 mai 2016 08:03
  • Bonjour,

    Merci pour la réponse mais j'ai trouver la solution a mon probléme, hier soir :

    les codes :

    Public Class Form1
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Me.Location = New Point(500, 100)
            With ListView1
                .Columns.Add("", 25)
                .Columns.Add("couleur", 200, HorizontalAlignment.Center)
                .OwnerDraw = True
                Dim list() As String = New String() {"Rouge", "bleu", "vert", "noir", "blanc", "jaune"}
                For i = 0 To list.Count - 1
                    Dim item1 As New ListViewItem
                    item1.SubItems.Add(list(i))
                    ListView1.Items.Add(item1)
                Next i
            End With
        End Sub
    
        Private Sub ListView1_DrawColumnHeader(sender As System.Object, e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
            ListView1.SuspendLayout()
            Dim G As Graphics = e.Graphics
            Dim Rect As New Rectangle(e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height - 3)
            G.FillRectangle(New SolidBrush(Color.White), Rect)
            G.DrawRectangle(Pens.WhiteSmoke, Rect)
            Dim TextSizeF As SizeF = G.MeasureString(e.Header.Text, e.Font)
            Dim TextSize As Size = New Size(CInt(TextSizeF.Width), CInt(TextSizeF.Width))
            Dim TextLeft As Integer = CInt((e.Bounds.Width / 2) - (TextSizeF.Width / 2)) + e.Bounds.Left
            Dim TextTop As Integer = CInt((e.Bounds.Height / 2) - (TextSizeF.Height / 2)) + e.Bounds.Top
            G.DrawString(e.Header.Text, e.Font, New SolidBrush(Color.Red), New Point(TextLeft, TextTop))
            ListView1.ResumeLayout()
        End Sub
    
        Private Sub ListView1_DrawItem(sender As System.Object, e As System.Windows.Forms.DrawListViewItemEventArgs) Handles ListView1.DrawItem
            ListView1.SuspendLayout()
            Dim G As Graphics = e.Graphics
            ListView1.ResumeLayout()
        End Sub
    
        Private Sub ListView1_DrawSubItem(sender As System.Object, e As System.Windows.Forms.DrawListViewSubItemEventArgs) Handles ListView1.DrawSubItem
            ListView1.SuspendLayout()
            Dim G As Graphics = e.Graphics
            Dim TextSizeF As SizeF = G.MeasureString(e.SubItem.Text, e.SubItem.Font)
            Dim TextSize As Size = New Size(CInt(TextSizeF.Width), CInt(TextSizeF.Width))
            Dim TextLeft As Integer = CInt((e.Bounds.Width / 2) - (TextSizeF.Width / 2)) + e.Bounds.Left
            Dim TextTop As Integer = CInt((e.Bounds.Height / 2) - (TextSizeF.Height / 2)) + e.Bounds.Top
            Dim Rect As New Rectangle(e.Bounds.Left, e.Bounds.Top, e.Bounds.Width, e.Bounds.Height)
            G.FillRectangle(Brushes.White, e.Bounds)
            G.DrawRectangle(Pens.White, Rect)
            G.DrawString(e.SubItem.Text, e.SubItem.Font, Brushes.Blue, New Point(TextLeft, TextTop))
            Select Case e.ColumnIndex
                Case 0
                    If e.Item.Checked = False Then
                        Dim CenterX As Integer = CInt(e.Bounds.Width / 2 - My.Resources.cancel.Width / 2) + e.Bounds.Left
                        Dim CenterY As Integer = CInt(e.Bounds.Height / 2 - My.Resources.cancel.Height / 2) + e.Bounds.Top
                        G.DrawImage(My.Resources.cancel, CenterX, CenterY)
                    Else
                        Dim CenterX As Integer = CInt(e.Bounds.Width / 2 - My.Resources.Yes.Width / 2) + e.Bounds.Left
                        Dim CenterY As Integer = CInt(e.Bounds.Height / 2 - My.Resources.Yes.Height / 2) + e.Bounds.Top
                        G.DrawImage(My.Resources.Yes, CenterX, CenterY)
                    End If
            End Select
            ListView1.ResumeLayout()
        End Sub
    
        Private Sub ListView1_ColumnWidthChanging(sender As System.Object, e As System.Windows.Forms.ColumnWidthChangingEventArgs) Handles ListView1.ColumnWidthChanging
            If ListView1.Columns(0).Width <> 25 Then 'Bloquer les deplacements des colomuns
                e.Cancel = True
                e.NewWidth = 25
            ElseIf ListView1.Columns(1).Width <> 200 Then
                e.Cancel = True
                e.NewWidth = 200
            End If
        End Sub End Class

    cordialement,


    • Modifié zorro591 vendredi 13 mai 2016 14:57
    vendredi 13 mai 2016 14:52
  • Donc dans votre code original l'erreur était:

    .OwnerDraw = False

    qu'il faut remplacer par

    .OwnerDraw = True

    vendredi 13 mai 2016 15:57
  • bonsoir,

    il y a pas erreur avec:

    OwnerDraw = True

    parque dans du démarrer le débogage dans Form1_Load , il affiche pas tous les codes qui est dedans.

    je sais pas pourquoi il s'affiche pas.

    vendredi 13 mai 2016 17:15
  • Parce qu'il manquait:

     G.DrawString(e.SubItem.Text, e.SubItem.Font, Brushes.Blue, New Point(TextLeft, TextTop))

    la deuxième colonne n'était pas dessinée.

    C'est le problème des événements Draw... elle permet de dessiner des trucs, mais il faut dessiner tous les trucs, sans exception.

    Honnêtement l'utilisation de .StateImageList. est plus simple et moins sujet à oublis.

    Votre solution donne ceci pour moi:

    Parce que c'est dépendant de la taille de vos images, résolution de l'écran, etc...

    Et le changement sur un click n'est pas implémenté...ce n'est pas un problème?

    samedi 14 mai 2016 09:36