ListBox VisualBasic

Résolu
Bonjour, alors voilà j'ai un soucis j'essaie de faire en sorte que les items du ListBox puisse être écarté pour sélectionner sur un ordinateur tactile.
voilà une image de ce que cela fait actuellement mais je trouve cela très serré


Merci
Cordialement

5 réponses

Résumé de la discussion

Le souci central est d'espacer les items du ListBox pour faciliter la sélection sur ordinateur tactile, car l'affichage actuel est trop serré et complique la manipulation précise des éléments par les doigts. Plusieurs participants suggèrent d'utiliser l'événement DrawItem pour dessiner manuellement les éléments et ainsi augmenter l'espacement, en associant ItemHeight et un centrage du texte lorsque l'index e.Index est valable. Des échanges techniques évoquent des détails VB.NET, notamment la gestion de l'erreur d'index -1 lors des modifications du datasource et l'utilisation de DrawString pour afficher les valeurs des items. En parallèle, une solution simple consiste à intercaler une ligne vide entre les éléments pour créer un espacement visuel sans modifier le dessin des items.

Bobot (l’IA à votre service)
  1. Contributeur
    C'est moi qui veut connaitre le langage!!!!
    Pour le code il faut faire un copier -coller sur le post. On ne peut pas travailler sur des images!!!!
    @+ Le Pivert
    1
    1. Private Sub Actualisation_Marque()
      Dim ConnectionSQL = New MySqlConnection
      Dim COMMAND = New MySqlCommand
      Dim SDA = New MySqlDataAdapter
      Dim dbDataSet = New DataTable
      Dim bSource = New BindingSource
      Dim Query As String
      ConnectionSQL.ConnectionString = "server=MONSERVEUR; userid=UTILISATEUR; password=MOT_DE_PASSE; database=BASE DE DONNEE"
      Try
      'Selection des marques dans la base de donnée et regroupement des doublons + Ordre alpha
      Query = "SELECT marque FROM BDD.TABLE GROUP BY marque ORDER BY marque"
      COMMAND = New MySqlCommand(Query, ConnectionSQL)
      With SDA
      .SelectCommand = COMMAND
      .Fill(dbDataSet)
      End With
      bSource.DataSource = dbDataSet
      LB1.DisplayMember = "marque"
      LB1.DataSource = bSource 'Rentre les noms des marques dans la listbox
      SDA.Update(dbDataSet)
      ConnectionSQL.Close()
      Catch ex As Exception
      MsgBox("Une erreur est survenue :" & vbNewLine & vbNewLine & "L'erreur est : " & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Erreur : 2")
      Finally
      ConnectionSQL.Dispose()
      End Try
      End Sub


      AH ok !!
      0
    2. Oui c'est du vb pardon :) et merci pour le lien je vais voir ce que cela donne
      0
    3. Bonjour, non ça n'est pas du Vb
      Du Vb c'était Vb1, ça fait 20 ans que ça n.esxiste plus
      Aujourd'hui il y a
      • VBS
      • VBA -> précisez:
        • Word
        • Excel
        • Access
        • Powerpoint
        • Autre
      • VB6 (ou antérieur, précisez)
      • VB.Net - précisez la Framework et ->
        • Winform
        • WPF


      Le problème étant que Microsoft n.est pas foutu de trouver des noms différents à des langages différents
      0
  2. Et donc le code que tu montres, ressemble fort à du Vb.net (comme l'a dit le Pivert) à supposer que tu travailles en winform ceci devrait t'aider
    https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listbox.itemheight?redirectedfrom=MSDN&view=netframework-4.8

    1
    1. Exact c du vb.net winForm quand au cas du ItemHeight je dois le placer dans le load ?
      Car si Oui alors j'ai un plus gros souci c'est que cela ne bouge strictement rien.

      Merci
      Cordialement
      0
    2. Voilà le problème que cela me fait


      J'ai écrits dans le load

      LB1.DrawMode = DrawMode.OwnerDrawFixed

      Attention : LB1 = ListBox1

      Et pour l'actualisation de ma base j'ai écrit ceci

      Private Sub Actualisation_Marque()
      Dim ConnectionSQL = New MySqlConnection
      Dim COMMAND = New MySqlCommand
      Dim SDA = New MySqlDataAdapter
      Dim dbDataSet = New DataTable
      Dim bSource = New BindingSource
      Dim Query As String
      ConnectionSQL.ConnectionString = "server=MONSERVEUR; userid=UTILISATEUR; password=MOT_DE_PASSE; database=BASE DE DONNEE"
      Try
      'Selection des marques dans la base de donnée et regroupement des doublons + Ordre alpha
      Query = "SELECT marque FROM BDD.TABLE GROUP BY marque ORDER BY marque"
      COMMAND = New MySqlCommand(Query, ConnectionSQL)
      With SDA
      .SelectCommand = COMMAND
      .Fill(dbDataSet)
      End With
      bSource.DataSource = dbDataSet
      LB1.DisplayMember = "marque"
      LB1.DataSource = bSource 'Rentre les noms des marques dans la listbox
      LB1.ItemHeight = 50
      SDA.Update(dbDataSet)
      ConnectionSQL.Close()
      Catch ex As Exception
      MsgBox("Une erreur est survenue :" & vbNewLine & vbNewLine & "L'erreur est : " & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Erreur : 2")
      Finally
      ConnectionSQL.Dispose()
      End Try
      End Sub

      Donc en résumé cela m'affiche une scrollBar vertical MAIS ne m'affiche aucune données :/

      Merci
      Cordialement
      0
    3. Non, comme indiqué dans le tuto que t'as donné le Pivert, il faut le mettre dans l'évènement MesureItem, il faut aussi écrire le texte et dessiner le cadre dans DrawItem.

      Copie le code et tu auras ça
      0
    4. PS avec itemheight = 20
      0
    5. Et si tu veux centrer le texte (avec itemHeight = 50 cette fois ci)
      			'valeurs par défaut
      			Dim fond As Brush = Brushes.Beige
      			Dim police As Font = Me.Font
      			Dim couleurTexte As Brush = Brushes.Black
      
      			' L' item est celui 'selected' si And sur 'State' et 'DrawItemState.Selected'= true. 
      			If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
      				fond = Brushes.CornflowerBlue
      				police = New Font(Me.Font, FontStyle.Bold)
      				couleurTexte = Brushes.White
      			End If
      
      			'centrer le texte
      			Dim texte As String = listBox1.Items(e.Index).ToString()
      			Dim tailleTexte As SizeF = e.Graphics.MeasureString(texte, police)
      			Dim x As Single = e.Bounds.X + (e.Bounds.Width - tailleTexte.Width) / 2
      			Dim y As Single = e.Bounds.Y + (e.Bounds.Height - tailleTexte.Height) / 2
      
      
      			'On dessine le rectangle du fond et on écrit le texte
      			e.Graphics.FillRectangle(fond, e.Bounds)
      			e.Graphics.DrawString(texte, police, couleurTexte, x, y)
      
      			' Rectangle bleue autour de chaque Item.
      			e.Graphics.DrawRectangle(Pens.Blue, New Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height))
      			'On diminue la largeur du rectangle de 1 pixel, sinon le coté droit n'est pas visible
      
      			' Afficher le focus rectangle .
      			e.DrawFocusRectangle()

      0
  3. Contributeur
    Bonjour,

    Une solution toute simple: tu intercales une ligne vide.
    0
    1. Bonjour merci de cette précision sauf que il y à un problème c'est que les items de la listbox proviennent d'une base de donnée :/

      Merci
      Cordialement
      0
    2. Contributeur
      @Programming_018D'abord, connaitre le langage de programmation?
      Ensuite voir le code
      0
    3. Volià le code qui me permet de remplir la listbox
      Quand à ce qui est de connaître le langage je le connais mais la listbox c'est la première fois que je dois m'en servir

      Merci
      Cordialement

      0
  4. Contributeur
    Je te propose d'intercaler une ligne comme ceci:

       Dim x As Integer
            'inverse  liste
            For x = ListBox1.Items.Count - 1 To 0 Step -1
                ListBox1.Items.Add(ListBox1.Items(x).ToString)
                ListBox1.Items.Remove(ListBox1.Items(x).ToString)
            Next
            'ajoute ligne
            For x = ListBox1.Items.Count - 1 To 0 Step -1
                ListBox1.Items.Add(ListBox1.Items(x).ToString)
                ListBox1.Items.Add(" ")
                ListBox1.Items.Remove(ListBox1.Items(x).ToString)
            Next


    a mettre après cette ligne en adaptant le nom de ta listBox

    LB1.DataSource = bSource 'Rentre les noms des marques dans la listbox 


    Voilà

    0
    1. Merci j'ai l'impression que cela pourrait fonctionner si j'arrive à gérer pourquoi cela me fait une erreur



      Merci
      Cordialement
      0
    2. Contributeur
      @Programming_018Je pense que le message est clair, il faut que tu trouves une autre solution! Et abandonner le fait d'agrandir les items.
      Quand tu lis bien le lien que je t'ai fourni, il est stipulé qu'il faut redessiner chaque item.
      Vaste tâche!!!!

      @+ Le Pivert
      0
    3. D'accord m'est moi je n'ai jamais dit que je voulais agrandir mes items je voulais juste les écartés :/

      Mais par contre non je ne peux pas abandonné car ce projet n'est pas pour moi c'est pour mon chef je suis en stage, alors cela serait vraiment sympa de votre part si vous avez une idée.

      Merci d'avance
      Cordilement
      0
    4. Contributeur
      @Programming_018J'ai pensé à une chose, si c'était ta DataSource que tu modifiais en y ajoutant des lignes vides intercalées

      A essayer!

      @+ Le Pivert
      0
    5. Merci à tous de votre aide vous avez raison c'est bien avec le DrawItem que cs_Le_Pivert ma fourni cela fonctionne parfaitement il me manquait juste à écrire

      à la ligne :

      e.Graphics.DrawString(Me.ListBox1.Items(e.Index), New Font(Me.Font, FontStyle.Bold)

      e.Graphics.DrawString(Me.ListBox1.Items(e.Index)("marque").ToString, New Font(Me.Font, FontStyle.Bold)

      puis quand j'ai rajouté le script de Whismeril pour centrer le texte tout est parfait je vous remerci à tous bonne journée maintenant je vais pouvoir avancer ;)
      0
  5. help for me quand j'étais en train de faire un script qui me permet d'ajouter des marques et que j'appuie sur entrée une erreur apparaît



    Private Sub Ajouter_Marque()
            Dim ConnectionSQL = New MySqlConnection
            Dim COMMAND = New MySqlCommand
            Dim Query As String
            ConnectionSQL.ConnectionString = URLBDD
            Dim READER As MySqlDataReader
            Try
                ConnectionSQL.Open()
                Query = "INSERT INTO marque(nomMarque) VALUES ('" & TxtMarque.Text & "')"
                COMMAND = New MySqlCommand(Query, ConnectionSQL)
                READER = COMMAND.ExecuteReader
                ConnectionSQL.Close()
                Actualisation_Marque()
                MsgBox("La marque : " & TxtMarque.Text & " a bien été ajouté !", MsgBoxStyle.Information, "Information : 3")
            Catch ex As Exception
                MsgBox("Une erreur est survenue :" & vbNewLine & vbNewLine & "L'erreur est : " & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Erreur : 2")
            Finally
                ConnectionSQL.Dispose()
            End Try
        End Sub


    si vous avez une solution je suis preneur
    0
    1. C'est quoi le code de Actualisation_Marque()?
      0
    2. Contributeur
      @Utilisateur anonymeJ'ai des doutes sur la syntaxe cette ligne!

      Dim texte As String = LB1.Items(e.Index)("marque").ToString()
      0
    3. Bonsoir alors pour ce qui est du code de Actualisation_Marque() le voci
      Dim ConnectionSQL = New MySqlConnection
              Dim COMMAND = New MySqlCommand
              Dim SDA = New MySqlDataAdapter
              Dim dbDataSet = New DataTable
              Dim bSource = New BindingSource
              Dim Query As String
              ConnectionSQL.ConnectionString = Connection de ma base de donnée
              Try
                  'Selection des marques dans la base de donnée et regroupement des doublons + Ordre alpha
                  Query = "SELECT marque FROM 853339_depannage.materielocass GROUP BY marque ORDER BY marque"
                  COMMAND = New MySqlCommand(Query, ConnectionSQL)
                  With SDA
                      .SelectCommand = COMMAND
                      .Fill(dbDataSet)
                  End With
                  bSource.DataSource = dbDataSet
                  LB1.DisplayMember = "marque"
                  LB1.DataSource = bSource 'Rentre les noms des marques dans la listbox
      
                  SDA.Update(dbDataSet)
                  ConnectionSQL.Close()
              Catch ex As Exception
                  MsgBox("Une erreur est survenue :" & vbNewLine & vbNewLine & "L'erreur est : " & vbNewLine & ex.Message, MsgBoxStyle.Critical, "Erreur : 2")
              Finally
                  ConnectionSQL.Dispose()
              End Try
          End Sub


      Et pour ce qui est de la ligne de votre doute quand j'enlève ("marque").ToString cela me fait ce qui suit :


      Alors que en le rajoutant cela fonctionne parfaitement

      Merci
      Cordialement
      0
    4. @Programming_018ha oui, en effet, du coup la ligne
      LB1.DisplayMember = "marque"
      ne sert à rien, puisque c'est toi qui écrit le texte.

      Le message d'erreur dit que l'index -1 est hors limites, ce qui est normal, les index vont de 0 à nombre d'items - 1.

      Puisque tu dis que ce message apparait à l'ajout, je suppose que c'est au moment ou tu changes le datasource (d'ailleurs il serait judicieux de faire
                  bSource.DataSource = Nothing'libére la ressource précédente
      bSource.DataSource = dbDataSet
      
      )
      Il y a un instant ou la liste est vidée, et l'index d'affichage (pas de la collection d'items) passe à -1, ce qui signifie qu'il n'y a rien de sélectionné.

      Je pense qu'en ajoutant un test sur e.Index différent -1 au début de la méthode DrawItem, ça va marcher.
      0