Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ajout de list a un item de listbox

    9 février 2021 à 17:10:26

    Bonjour,

    Je porte un programme écrit en vb en vbnet pour mon taf.

    Je rencontre la difficulté suivante:

    Voici ce je doit porter:

    Do While Not l_rs1.EOF

        .AddItem Trim(l_rs1("obj_name"))

        .List(.ListCount - 1, 1) = l_rs1("obj_dn")

        .List(.ListCount - 1, 2) = l_rs1("obj_id")

        l_rs1.MoveNext

        DoEvents

    Loop

    Et voici la ou j'en suis:

    Do While l_rs1.Read

    LstlistObject.Items.Add(l_rs1("obj_name"))

            'Je n'arrive pas a trouver comment ajouter des listes a un item sans que cela se voit

            System.Windows.Forms.Application.DoEvents()

    loop

    Merci pour votre aide

    • Partager sur Facebook
    • Partager sur Twitter
      9 février 2021 à 17:56:31

      Houlà, c'est quoi cette horreur !!!

      Primo, pensez à utiliser le bouton [</>] pour poster des bouts de codes.

      Secondo, il manque la partie "With" du code VB pour qu'on sache de quoi on parle précisément.

      VB.NET n'est pas l'héritier de VB6, c'est un langage .NET camouflé en VBx.

      Il y a pas mal de cochonneries VB6 qui ne fonctionnent plus en VB.NET et c'est tant mieux !!!

      Vous n'avez pas besoin de cochonnerie à base de "DoEvents" à la con, juste parce que le model de threading et le DataBinding de VB6 étaient complètement aux fraises.

      Vous n'avez pas besoin ni de boucle "Do While" ni de DoEvents à la con.

      Utilisez la propriété DataSource d'une ListBox et l'affichage des données se fera automatiquement.

      https://docs.microsoft.com/fr-fr/dotnet/api/system.windows.forms.listbox?view=net-5.0

      https://docs.microsoft.com/fr-fr/dotnet/api/system.windows.forms.listcontrol.datasource?view=net-5.0

      Si c'est du multi-colonne :

      https://docs.microsoft.com/fr-fr/dotnet/api/system.windows.forms.listbox.multicolumn?view=net-5.0

      Mais je vous conseillerai plutôt de basculer sur une DataGrid.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        10 février 2021 à 11:24:37

        Bonjour et merci de votre retour.

        C'est la première fois que je post une quelconque demande.

        En générale, je me débrouille avec les recherches internet.

        Je ne connaissais pas l'existence des boutons [</>] merci pour l'info.

        Voici le bloc au complet (il en existe plein dans ce programme) :

        With SuperObject.LstSuperObjectType
            .Clear
            
            .AddItem "Pilotes Statistiques"
            .List(.ListCount - 1, 1) = 25   'class
            .List(.ListCount - 1, 2) = 0   'type
            .AddItem "Pilotes de Routage"
            .List(.ListCount - 1, 1) = 10   'class
            .List(.ListCount - 1, 2) = 0   'type
            .AddItem "GTs Agent"
            .List(.ListCount - 1, 1) = 13   'class
            .List(.ListCount - 1, 2) = 0   'type
            .AddItem "GTs SVI"
            .List(.ListCount - 1, 1) = 13   'class
            .List(.ListCount - 1, 2) = "1-2"   'type
            .AddItem "GTs Autre"
            .List(.ListCount - 1, 1) = 24   'class
            .List(.ListCount - 1, 2) = "1-2" 'type
            .AddItem "Files d'attente"
            .List(.ListCount - 1, 1) = 12   'class
            .List(.ListCount - 1, 2) = "0-1-2"   'type
        End With

        Ce que je souhaite (enfin ce qu'on me demande) c'est de porter en vb.NET plus de 60 programmes fait en vb.

        Sur ce programme, on ajoute des items et a chaque item on ajoute une "class" et un "type" via 'list'. 'list" que je ne retrouve pas en vbnet.

        A l'affichage seul l'item est visible et dois rester le seul a être visible (pas d'autres colonnes affichées par item).

        Et c'est bien la le problème car sur l'ancienne version seul l'item est visible et avec un index et un numéro de "colonne" on récupére des infos sur cet item. 

        J'ai déjà tenté le multi-colonne mais tout est visible. A mois que l'on puisse "camoufler" une ou plusieurs colonnes.

        Merci encore pour votre retour.

        J’espère avoir été plus clair et j’espère que vous saurez m'aider avec ces nouvelles informations.



        • Partager sur Facebook
        • Partager sur Twitter
          10 février 2021 à 19:09:48

          je pense que ton objet à porter n'est pas une simple ListBox de base, mais c'est une ListBox de Forms 2.0.

          Je pense qu'il faut que tu gères ta liste en dehors de l'objet, et tu n'ajoutes à ta listbox que le nom visible. Tu utiliseras l'index du choix pour pointer le bon élément de ta liste. Ta liste contiendra (par exemple) des objets avec les infos de l'item (nom, classe, type)

          • Partager sur Facebook
          • Partager sur Twitter
            10 février 2021 à 19:21:48

            Ok, c'est beaucoup plus clair.

            C'est une horrible manière de faire, caractéristique du codage VBx "à l’arrache".

            Le manque de méthode et de rigueur des années 1990 dans toute sa splendeur.

            Il est possible de "mimiquer" ces mêmes horreurs en VB.NET mais est-ce vraiment raisonnable ???

            Le truc le plus approchant de "List" du VBx est la propriété Items en VB.NET

            https://docs.microsoft.com/fr-fr/dotnet/api/system.windows.forms.listbox.items?view=net-5.0

            Mais je pense que vous aurez largement plu d'avantage à faire au moins un petit refactoring our éviter de refaire ces cochonneries spécifiques à VBx et donc de plus en plus dur à refaire et de moins en moins justifiable.

            Moi, je vous conseille de tirer parti au maximum des fonctionnalités VB.NET pour vous débarrasser de ces horreurs pour avoir un code plus simple concis et maintenable à long terme.

            Cela veut dire l'utilisation, à défaut d'un "vrai" ORM, d'une DataTable et le DataBinding via les propriétés DataSource, DisplayMember, ValueMember et SelectedValue.

            L'utilisation d'un curseur (cf. "MoveNext") et d'un DoEvents dans votre premier code semble montrer que vous passez de données en "dures" dans le code à des données récupérées depuis une base de données, cool. Mais c'est fait de la très mauvaise façon (à la VBx, beurk!!!).

            Donc, si vous prenez la peine de refactorer votre application, faites-le avec les bons outils.

            - Pas de DoEvents à tort et à travers. Normalement, en VB.NET ce n'est jamais justifié (le mode de threading est bien meilleur en VB.NET).

            - Ne pas utiliser de "RecordSet (MoveNext)" mais une combinaison de DataAdaptor/DataSet/DataTable.

            En utilisant des DataTable (ou des DataView) comme sources de données, tout ce type de code "en dur"/boucle de "MoveNext" disparaîtra et la simple affection des propriétés DataSource, DisplayMember et ValueMember feront tout le travail et simplifieront drastiquement tout le code de tuyauterie pour la récupération des données depuis ces ListBox (qui ne seront plus les "vraies" sources de données mais les DataTable).

            Cela est peut-être un refactoring un peu plus "ambitieux" que celui que vous envisagiez mais le résultat en sera grandement meilleur, avec un code beaucoup beaucoup plus simple et concis, une fois les concepts assimilés.

            -
            Edité par bacelar 10 février 2021 à 19:25:13

            • Partager sur Facebook
            • Partager sur Twitter
            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

            Ajout de list a un item de listbox

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown