Vb.Net Remplire une Listview d'une façon horizontale [Résolu]

Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 10 oct. 2016 à 22:48 - Dernière réponse : Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention
- 14 oct. 2016 à 12:13
Bonjour ou Bonsoir,
en créant le code suivante je voulais remplir une ListView non d'une façon verticale mais d'une façon horizontale comme le montre l'image suivante :

j'avais beau chercher je n'ai rien pu trouver, alors j'ai décidé de créer mon propre code
je rempli la Textbox1 avec une valeur, je clique sur le bouton "Remplir"
dans la ListView une 1er colonne est crée et rempli par la valeur de la Textbox1
je rempli la Textbox1 avec une nouvelle valeur et je clique sur le bouton "Remplir"
dans la ListView une 2ème colonne est crée et rempli par la nouvelle valeur de la Textbox1
ainsi de suite :
voici le code
 Dim i As Integer = 0
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ListView1.View = View.Details
If i = 0 Then
ListView1.Items.Add("")
ListView1.Columns.Add("Valeur " & 0, 75, HorizontalAlignment.Left)
ListView1.Items(0).SubItems.Add(TextBox1.Text)
ElseIf i > 0 Then
ListView1.Width = ListView1.Width + 75
ListView1.Columns.Add("Valeur " & i, 75, HorizontalAlignment.Left)
ListView1.Items(0).SubItems.Add(TextBox1.Text)
End If
TextBox1.Clear()
i = i + 1
End Sub

mais le problème est que quand je clique sur le bouton "Remplir" la colonne est crée mais elle sera vide même si la Textbox1 n'est pas vide
quand je rempli la Textbox1 avec une nouvelle valeur et je clique sur le bouton "Remplir" une nouvelle colonne est crée mais elle n'est pas rempli avec la nouvelle valeur de la Textbox1 mais avec l'ancien valeur, même chose pour tous les autres colonnes
aidez-moi s'il vous plaît
Merci pour votre future aide
Afficher la suite 
179Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention

15 réponses

Répondre au sujet
Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - Modifié par Karin.code le 11/10/2016 à 10:55
+1
Utile
7
Bonjour,
Après quelque essais j'ai finis par trouver une solution plutôt satisfaisante, voici le code :

Dim i As Integer = 0
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ListView1.View = View.Details
If i = 0 Then
ListView1.Columns.Add("Valeur " & 0, 0, HorizontalAlignment.Center)
ListView1.Items.Add("")
ListView1.Width = ListView1.Width + 75
ListView1.Columns.Add("Valeur " & 1, 75, HorizontalAlignment.Center)
ListView1.Items(0).SubItems.Add(TextBox1.Text)
ElseIf i > 0 Then
ListView1.Width = ListView1.Width + 75
ListView1.Columns.Add("Valeur " & i + 1, 75, HorizontalAlignment.Center)
ListView1.Items(0).SubItems.Add(TextBox1.Text)
End If
TextBox1.Clear()
TextBox1.Focus()
i = i + 1
End Sub

et pour éviter l'alignement à gauche par défaut de la première colonne j'ai ajouté cette partie :
ListView1.Columns.Add("Valeur " & 0, 0, HorizontalAlignment.Center)
ListView1.Items.Add("")
ListView1.Width = ListView1.Width + 75
ListView1.Columns.Add("Valeur " & 1, 75, HorizontalAlignment.Center)
ListView1.Items(0).SubItems.Add(TextBox1.Text)
Cette réponse vous a-t-elle aidé ?  
Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention > vb95 1385 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 11 oct. 2016 à 13:35
Bonjour kikou93 et vb95,
Merci de m'avoir répondu

Pour éviter l'alignement à gauche de la première colonne ( la colonne 0) on peut définir cette colonne 0 avec une largeur = à 0 et on commence l'affichage à la colonne 1

Ce n'est pas ce que j'ai fait avec ce bout de code?
If i = 0 Then
ListView1.Columns.Add("Valeur " & 0, 0, HorizontalAlignment.Center)
ListView1.Items.Add("")
ListView1.Columns.Add("Valeur " & 1, 75, HorizontalAlignment.Center)
ListView1.Items(0).SubItems.Add(TextBox1.Text)

Concernant ce qu'a dit kikou93 (
Listview1.Scrollable = False
), cela ne me pose pas problème, car je n'ai pas besoin d'une Scrollbar Verticale (je n'ai besoin de qu'une seul ligne, c'est pour ça que j'ai ajuster la hauteur de Listview pour qu'elle convient à cette dernière)
j'ai juste besoin de s'avoir comment interdire de modifier la largeur d'une colonne manuellement
vb95 1385 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention > Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 11 oct. 2016 à 18:12
Salut Karin.code
Si c'est ce que tu fais avec le code ( j'avais mal vu) . surtout que moi je prépare mes colonnes avec l'interface et non par code !
Pour interdire la modification de la largeur des colonnes sers toi de ce code

e.Cancel = True
e.NewWidth = DirectCast(sender, ListView).Columns(e.ColumnIndex).Width


à mettre dans l'évènement Listview1._ColumnWidthChanging(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnWidthChangingEventArgs) Handles Listview1.ColumnWidthChanging

Pour cela tu cliques dans ta Listview : par défaut tu auras la Sub Evènement SelectedIndexChanged . Tu cherches l'évènement ColumnWithChanging et tu doubles-clicques . Dans le code de ta feuille tu auras la sub évènement qui s'est créée ! Reste plus qu'à y mettre ce code
Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention > vb95 1385 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 11 oct. 2016 à 20:47
Merci cela fonctionne bien
juste une dernière chose si ça ne te dérange pas, est il possible de changer la couleur des titres des colonnes (Valeur 1, Valeur 2 ,... etc)
j'ai chercher mais je n'ai trouvé que le code qui permet de changer la couleur du texte et l'arrière plan des lignes (ForceColor, Backcolor)

J'ai trouver ce code qui me permet de changer la couleur du texte et l'arrière plan d'un cellule
ListView1.Items(0).UseItemStyleForSubItems = False
ListView1.Items(0).SubItems(2).ForeColor = Color.Blue
ListView1.Items(0).SubItems(2).BackColor = Color.Green
vb95 1385 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention > Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 11 oct. 2016 à 21:06
bonsoir Karin.code
A ma connaissance je ne crois pas que cela est possible facilement ! Je ne sais nullement comment il faut faire ! Je vais chercher et si j'ai quelque chose de concluant je t'avertirais
Bonne soirée à toi
Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention > vb95 1385 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 11 oct. 2016 à 21:25
Merci pour ton aide
Bonne soirée à toi aussi
Commenter la réponse de Karin.code
cs_ShayW 3233 Messages postés jeudi 26 novembre 2009Date d'inscription 6 décembre 2017 Dernière intervention - Modifié par cs_ShayW le 12/10/2016 à 23:08
+1
Utile
Bonjour

on joue avec l'event DrawColumnHeader


On déclare une liste de couleur
Private listbrush As New List(Of Brush) From {Brushes.Blue, Brushes.Green, Brushes.Gray, Brushes.Fuchsia, Brushes.Red, Brushes.Indigo, Brushes.DarkCyan, Brushes.DarkGoldenrod, Brushes.Khaki, Brushes.DarkMagenta}

tu peux en ajouter
dans le code du
Private Sub Button1_Click
ajoute
 ListView1.OwnerDraw = True

et
remplace "Valeur " par ""
ListView1.Columns.Add("", 75, HorizontalAlignment.Center) 



 Private Sub ListView1_DrawColumnHeader(sender As Object, e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
e.Graphics.DrawString("valeur" & e.ColumnIndex.ToString, New Font("arial", 12, FontStyle.Bold), listbrush(e.ColumnIndex Mod listbrush.Count), e.Bounds.X, 1)
End Sub
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_ShayW
cs_Le Pivert 4759 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - 13 oct. 2016 à 18:47
+1
Utile
1
Bonjour,

Comme ceci:

Option Strict On
Public Class Form1
    Dim i As Integer
    Private Sub ListView1_DrawColumnHeader(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
        Dim sf As New StringFormat()
        Try
            Select Case e.Header.TextAlign
                Case HorizontalAlignment.Center
                    sf.Alignment = StringAlignment.Center
                Case HorizontalAlignment.Right
                    sf.Alignment = StringAlignment.Far
            End Select

            Dim headerFont As New Font("Arial", 8, FontStyle.Bold)
            Try
                e.Graphics.DrawString(e.Header.Text, headerFont, Brushes.Red, _
                                      New Point(e.Bounds.X + 5, e.Bounds.Y + 1), sf)
            Finally
                headerFont.Dispose()
            End Try

        Finally
            sf.Dispose()
        End Try
    End Sub
    Private Sub ListView1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewItemEventArgs) Handles ListView1.DrawItem
        e.DrawDefault = True
    End Sub
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        ListView1.View = View.Details
        If i = 0 Then
            ListView1.Columns.Add("Valeur " & 0, 75, HorizontalAlignment.Left)
            ListView1.Items.Add(TextBox1.Text)
        ElseIf i > 0 Then
            ListView1.Width = ListView1.Width + 75
            ListView1.Columns.Add("Valeur " & i, 75, HorizontalAlignment.Left)
            ListView1.Items(0).SubItems.Add(TextBox1.Text)
        End If
        TextBox1.Clear()
        i = i + 1
        ListView1.OwnerDraw = True
    End Sub
End Class

Cette réponse vous a-t-elle aidé ?  
Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 13 oct. 2016 à 21:54
Bonsoir cs_Le Pivert,
ça fonctionne très bien Merci
Maintenant je peux mettre les valeur dans la ListView
il ne reste plus que l'apparence du tableau
Pour séparer les titres et les valeurs j'ai ajouter le code suivant :
Private Sub ListView1_DrawColumnHeader(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
X = X + 100
e.Graphics.DrawLine(New Pen(SystemColors.Control, 1), 0, 26, X, 26)
End Sub

Ça fonctionne
pour séparer les colonnes entre elles j'ai ajouter le code suivant :
X = X + 100
Dim Graph As Graphics
Graph = Me.ListView1.CreateGraphics
' For R = 0 To X Step 100
Dim paint As Pen = New Pen(Color.Green, 2)
paint.DashStyle = Drawing2D.DashStyle.Solid
Graph.DrawLine(paint, X, 0, X, 26)

mais cela ne fonctionne pas
Commenter la réponse de cs_Le Pivert
cs_Le Pivert 4759 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 11 décembre 2017 Dernière intervention - Modifié par cs_Le Pivert le 14/10/2016 à 08:21
+1
Utile
Voilà:

 Private Sub ListView1_DrawColumnHeader(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
        Try
            'Rectangle
            e.Graphics.FillRectangle(Brushes.Black, e.Bounds)'couleur contour
            'Rectanglesuperieur (Il est superposé au rectangle précédent et plus petit ou ±)
            Dim RectPoint As New Point(e.Bounds.X + 1, e.Bounds.Y + 1)
            Dim RectSize As New Size(New Point(e.Bounds.Width - 2, e.Bounds.Height - 2))
            Dim Rect As New Rectangle(RectPoint, RectSize)
            e.Graphics.FillRectangle(Brushes.Yellow, Rect) 'couleur fond BackColor
        Finally
        End Try
        Dim sf As New StringFormat()
        Try
            Select Case e.Header.TextAlign
                Case HorizontalAlignment.Center
                    sf.Alignment = StringAlignment.Center
                Case HorizontalAlignment.Right
                    sf.Alignment = StringAlignment.Far
            End Select

            Dim headerFont As New Font("Arial", 8, FontStyle.Bold)
            Try
                e.Graphics.DrawString(e.Header.Text, headerFont, Brushes.Red, _
                                      New Point(e.Bounds.X + 5, e.Bounds.Y + 1), sf) 'couleur police ForeColor
            Finally
                headerFont.Dispose()
            End Try

        Finally
            sf.Dispose()
        End Try
    End Sub


@+ Le Pivert
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Le Pivert
Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - Modifié par Karin.code le 13/10/2016 à 10:35
0
Utile
1
Bonjour cs_ShayW,
Merci pour ta réponse
le code que tu a suggéré marche mais pas à 100%
le résultat finale devrait être comme ça :

mais il y a quelque défaut

1/- l'arrière plan des titres n'est plus affiché :

2/- les valeurs écrit dans le TextBox1 ne s'affiche pas :

3/- Le texte est aligné à gauche même si je précise l'alignement en centre
4/- Valeur 0 et 1 sont superposé :

Voici comment j'ai fait, peut-être que j'ai mal posé ton code :
Private listbrush As New List(Of Brush) From {Brushes.Blue}
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ListView1.View = View.Details
ListView1.GridLines = True
If i = 0 Then
ListView1.Items.Add("")
ListView1.Columns.Add("" & 0, 0, HorizontalAlignment.Center)
ListView1.Columns.Add("" & 1, 100, HorizontalAlignment.Center)
ListView1.Items(0).SubItems.Add(TextBox1.Text)
ElseIf i > 0 Then
ListView1.Width = ListView1.Width + 100
ListView1.Columns.Add("" & i + 1, 100, HorizontalAlignment.Center)
ListView1.Items(0).SubItems.Add(TextBox1.Text)
End If
TextBox1.Clear()
TextBox1.Focus()
i = i + 1
ListView1.OwnerDraw = True
End Sub
Private Sub ListView1_DrawColumnHeader(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
e.Graphics.DrawString("valeur" & e.ColumnIndex.ToString, New Font("Georgia", 12, FontStyle.Bold), listbrush(e.ColumnIndex Mod listbrush.Count), e.Bounds.X, 1)
End Sub
Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 13 oct. 2016 à 12:58
Désolé je n'ai pas lu ton code, j'ai juste copie ce deriner
mais maintenant en le regardant de plus près ce code permet de dessiner les titres (Valeur 1, Valeur 2,Valeur 3 ..etc)
pour le 1er défaut : l'arrière plan des titres n'est plus affiché
j'ai ajouté dans :
Private Sub ListView1_DrawColumnHeader(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
End Sub

ça :
e.Graphics.DrawLine(New Pen(SystemColors.Control, 1), 0, 26, X, 26)
e.Graphics.DrawLine(New Pen(SystemColors.Control, 1), X, 0, X, 26)
X=X+1

Bien sûr X est déclaré en haut
Dim X As Integer =0

une ligne horizontale et verticale chaque X=100
mais le problème pour la ligne verticale j'arrive à ajouter qu'une seul ligne
pour le 2eme défaut : j'arrive toujours pas à trouver une solution

pour la 3eme défaut :
Le texte est aligné à gauche même si je précise l'alignement en centre
j'ai changer ça

e.Bounds.X

par ça
e.Bounds.X + 8

dans
e.Graphics.DrawString("Valeur " & e.ColumnIndex.ToString, New Font("Georgia", 12, FontStyle.Bold), listbrush(e.ColumnIndex Mod listbrush.Count), e.Bounds.X, 1)

Ça ne pose pas de problème car je n'ai que 30 valeurs dans mon tableau (le titre reste dans l'espace réservé pour lui)

pour le 4eme défaut :
Valeur 0 et 1 sont superposé
j'ai ajouté la condition suivante :
 If e.ColumnIndex.ToString = 0 Then

ElseIf e.ColumnIndex.ToString > 0 Then
e.Graphics.DrawString("Valeur " & e.ColumnIndex.ToString, New Font("Georgia", 12, FontStyle.Bold), listbrush(e.ColumnIndex Mod listbrush.Count), e.Bounds.X + 8, 1)
End If
Commenter la réponse de Karin.code
Karin.code 179 Messages postés vendredi 2 septembre 2016Date d'inscription 30 août 2017 Dernière intervention - 14 oct. 2016 à 12:13
0
Utile
Bonjour cs_Le Pivert,
Merci beaucoup ca fonctionne très bien
bien sûr merci aussi à vb95 et cs_ShayW
vous m'avez été d'une grand aide
Commenter la réponse de Karin.code

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.