Ou sont passer les index sous VB.NET

Signaler
Messages postés
8
Date d'inscription
jeudi 8 avril 2010
Statut
Membre
Dernière intervention
30 août 2011
-
Messages postés
491
Date d'inscription
mercredi 1 février 2006
Statut
Membre
Dernière intervention
18 novembre 2016
-
Bonjour,

Je développe depuis quelque années sous VB6, je me suis abitué aux index.
Dans VB.NET ou sont passée ces indéxes ou comment faire la même chose ?


Pierre B

15 réponses

Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
Bonjour,

éh,ben... aux oubliettes !

Amicalement,
Us.
Messages postés
4
Date d'inscription
mercredi 29 novembre 2006
Statut
Membre
Dernière intervention
22 mars 2011

moi aussi je suis un inconditionnel de VB6 et là je deviens fou, les choses les plus simples et intuitives que l'on faisait sous VB6 ne marchent plus...

Si par exemple je voulais remplir des textbox par une valeur différente je m'aidais des index pour ce faire par exemple :


il suffisait juste de mettre ça dans le click du bouton :

Dim x As Integer
For x = 0 To 3
Txt(x).Text = "valeur de l'index : " & x
Next


Comment j'obtiens la même chose en .net ?
Je crée des programmes qui utilisent beaucoup de boutons (comme une caisse enregistreuse par exemple), et l'index me servait énormément. par exemple je créais pour un seul bouton et des dizaines d'index une seule fonction qui allait chercher mes valeurs de propriété (comme la couleur, le caption, le tag etc...) en base de donnée. sans parler de leur positionnement qui était géré par index...

Aidez moi s'il vous plait pour faire juste ce petit exemple en code avec une boucle.
Je pense qu'il faut fonctionner en collection mais même si google est mon ami je n'ai rien trouvé qui s'approche...

Merci d'avance

08X S%

Bonjour,
On fait la même chose mais un peu différemment :
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'declaration des textbox
        Dim btn(4) As TextBox
        For x = 0 To btn.Length - 1
            'nouveau textbox
            btn(x) = New TextBox
            With btn(x)
                .Width = 150
                .Text "Valeur de l'index " & x.ToString
                .Location = New Point(5, x * 30)
                .Tag = x
            End With
            'ajout d'un gestionnaire d'événement click
            AddHandler btn(x).Click, AddressOf btn_Click
            'ajout du controle au formulaire
            Me.Controls.Add(btn(x))
        Next
    End Sub

    Private Sub btn_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        'cliquer dans les textbox
        Dim btn As TextBox = DirectCast(sender, TextBox)
        MessageBox.Show(btn.Tag.ToString)
    End Sub
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
Bonjour,

Bon code à retenir de Banana, mais je crois que la question est légèrement différente.

JE ne connais pas la meilleure méthode pour faire comme les index de VB6, mais pour ma part j'utilise un substitue qui consiste à mettre les objets (boutons,ou label, etc) dans un groupe de contrôle, puis chaque objet sont nommés en ajoutant un numéro (au début ou à la fin si le nom est générique) ou encore au Tag. Ensuite je liste les objets avec "For each" en exploitant éventuellement le numéro pour connaitre faire traitement spécifique si besoin.

Exemple tiré d'un programme en cours :

        Dim Carte As Control 'défini une variable

        ' Cartes privatives + Tableau
        For Each Carte In Form2.GroupBox11.Controls  'boucle for each dans le groupe de control GroupBox11
            If TypeOf Carte Is Button Then ' test du type d'objet = ici si c'est un bouton
                If Carte.Name.Substring(0, 4).ToString = "Card" Then ' extrait les 4 premières lettres du nom
                    Compte += 1 ' mon traitement
                    If Not String.IsNullOrEmpty(Carte.Tag) Then Main(Compte) = CInt(Carte.Tag.ToString.Substring(1)) 'encore mon traitement 
                End If
            End If
        Next Carte 'bouclage 


Bien sur on peut aussi le faire sur toute la Form ou plusieurs groupe de control... etc. Ce n'est exemple spécifique, je vous indique juste vers quoi chercher...

Amicalement,
Us.

Merci us_30 pour ton exemple.
Effectivement ceci répond mieux à la 2ème question.
Ceci dit, en .NET il est possible de fournir une classe au Tag d'un contrôle afin de s'en resservir dans une énumération comme tu l'as montré dans ton exemple.
Je ne sais pas si c'était faisable avec vb6 ?
Messages postés
420
Date d'inscription
vendredi 17 novembre 2006
Statut
Membre
Dernière intervention
15 juillet 2014
5
Il y a aussi la possibilité, si les noms sont générique par exemple 'monTextBox_1', 'monTextBox_2', 'monTextBox_3', de faire ceci.
For i As Integer = 1 To 3
  CType(Me.Controls("monTextBox_" & i.ToString()), TextBox).Text = _
        "valeur de l'index : " & i.ToString()
Next


Pour le raprochement avec les index d'une base de données, il est aussi possible de mettre en place cette solution qui est basé sur le même principe que l'exemple de banana32.

Private mesTextBox As System.Collections.Generic.SortedList(Of Integer, TextBox)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

  'Création des textbox
  Dim indexBdd As Integer
  Dim unTextBox As TextBox
  For indexBdd = 1 To 3
      unTextBox = New TextBox()
      unTextBox.Name = "monTextBox_" & indexBdd.ToString()
      unTextBox.Text = "valeur de l'index : " & indexBdd.ToString()
      ...
      Me.Controls.Add(unTextBox)
      mesTextBox.Add(indexBdd, unTextBox)
  Next

 End Sub

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  'Accès au textbox d'index 3
  Console.WriteLine(mesTextBox(3).Text)
End Sub


Cette technique est surtout avantageuse dans le cas ou le nombre d'accès aux TextBox est important.

Après, il existe pas mal de solutions...
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
Re,

Banana, si en VB6 cela est aussi faisable mais maladroit puisqu'il existe les index .

Floiv57, effectivement CTYPE est aussi bien adapté pour répondre au problème. Pour celui qui vient de VB6, CTYPE est "presque" l'équivalent de CallByName de VB6. (Je dis presque, car CType n'est pas si général que CallByName mais s'en rapproche beaucoup. Mais ce n'est qu'un point de détail qui n'a pas d'intérêt ici.)

Il reste qu'il me semble que l'emploi de "For Each" est tout même préférable, pas en tant que performance, mais en tant que souplesse. Lorsqu'on code on retouche mille fois les objets, donc mieux vaut éviter le "For To" qui redemande de retoucher aussi les indices... Ce n'est qu'une simple question de pratique, qui ne change rien dans le fond.

Amicalement,
Us.
Messages postés
4
Date d'inscription
mercredi 29 novembre 2006
Statut
Membre
Dernière intervention
22 mars 2011

Ah merci exemple très précis, donc pour changer le nombre de textbox qui apparaissent on modifie juste la déclaration"Dim btn(50) As textbox" par exemple !!!

ok pour ça et merci encore ça va déjà vachement m'aider, mais si sur ma form j'ai déjà des textbox (avec des emplacements spécifiques et des tailles différentes) comment je les nomme pour pouvoir leur donner un index ?

Bref je ne veux pas les créer dynamiquement mais les positionner physiquement sur ma form... (car mon programme se réfère aux objets et à leur emplacement pour un redimensionnement suivant la résolution écran)

Merci de ton aide en tout cas !!!

08X S%
Messages postés
4
Date d'inscription
mercredi 29 novembre 2006
Statut
Membre
Dernière intervention
22 mars 2011

oops désolé j'ai écris mon message ce matin et je ne l'ai posté que cet après midi sans faire un refresh de la page, j'avais pas vu vos messages complémentaires...

Merci je pense que la fonction CType va bien m'aider, ça correspond plus à ma compréhension vb.

Je vais tester ça tout de suite...

Merci encore...

(car mon programme se réfère aux objets et à leur emplacement pour un redimensionnement suivant la résolution écran)


Dans ce cas tu peux peut-être te servir du TableLayoutPanel pour disposer tes contrôles automatiquement sur ton formulaire.

Bonne soirée.
Messages postés
4
Date d'inscription
mercredi 29 novembre 2006
Statut
Membre
Dernière intervention
22 mars 2011

oui banana, j'ai vu cet outil qui permet pas mal de choses, ça change vraiment le type de conception que l'on peut avoir avec vb6, je crée des apps pour écrans tactiles et il fallait que je crée des proportionnalités en code pour que mon log marche aussi bien sur un écran 10" que sur un 15" un peu comme ça : (fait sous VB10)

    Dim x As Integer
    Dim y As Integer
    Dim z As Integer
    Dim var As Integer
    Dim var2 As Integer

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' définit les proportions et les variables
        x = Me.Width / 4
        y = Me.Height / 4
        z = Me.Width / 3
        var = 0
        var2 = 0
        ' boucle pour le placement des boutons faussement indexés !!!
        For i As Integer = 0 To 14
            CType(Me.Controls("btn_" & i.ToString()), Button).Width = x
            CType(Me.Controls("btn_" & i.ToString()), Button).Height = y
            CType(Me.Controls("btn_" & i.ToString()), Button).Top = var2 * y
            CType(Me.Controls("btn_" & i.ToString()), Button).Left = var * x
            CType(Me.Controls("btn_" & i.ToString()), Button).Text = "index : " & i.ToString()
            CType(Me.Controls("btn_" & i.ToString()), Button).Tag = i.ToString()
            ' déplacement vers la droite
            var = var + 1
            ' descendre d'une ligne si :
            If i > 2 Then var2 = 1
            If i > 6 Then var2 = 2
            If i > 10 Then
                var2 = 3
            ' à la ligne 3 il n' y a de 3 boutons donc on change de variable
                x = z
            End If
            ' retour à la ligne pour les boutons
            If var > 3 Then var = 0
        Next
    End Sub

(désolé mon code n'est pas très joli mais c'est le début de vb10 et je patauge encore)
il suffit de mettre 15 boutons nommées de btn_0, btn_0 à btn_14, et le placement se fait dans la forme, normalement je mets le code dans le form resize mais là j'ai pas encore compris comment ça marchait...

C'est vrai que sans code avec juste un TableLayoutPanel on fait la même chose juste en les incrémentant

Carpe diem quam minimum credula postero
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
8
Bonjour,

Voilà ma version avec la structure que j'avais indiquée :

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load, Me.Resize

        ' Paramètres (en local !)
        Dim x As Integer = Me.Width / 4
        Dim y As Integer = Me.Height / 4
        Dim z As Integer = Me.Width / 3
        Dim var As Integer = 0
        Dim var2 As Integer = 0
        Dim i As Integer = 0

        ' boucle pour le placement des boutons faussement indexés !!!
        Dim MesObjets As Control

        For Each MesObjets In Me.Controls
            If TypeOf MesObjets Is Button Then
                With MesObjets
                    If .Name.Substring(0, 4).ToString = "Btn_" Then 'Seuls les boutons btn_ sont concernés
                        i = CInt(.Tag) ' récupére l'index défini dans le TAG
                        .Width = x
                        .Height = y
                        .Top = var2 * y
                        .Left = var * x
                    End If
                End With
            End If

            ' déplacement vers la droite
            var = var + 1
            ' descendre d'une ligne si :
            If i > 2 Then var2 = 1
            If i > 6 Then var2 = 2
            If i > 10 Then
                var2 = 3
                ' à la ligne 3 il n' y a de 3 boutons donc on change de variable
                x = z
            End If
            ' retour à la ligne pour les boutons
            If var > 3 Then var = 0
        Next

End Sub


Dans les TAG des boutons il faut définir l'index avant... Il semble également vraiment inutile de récrire le Tag par l'index comme tu le fait... Et ma petite remarque perso, comme je le disais, c'est plus souple. Ensuite, on peut dans le même genre d'astuce utiliser TabIndex...
De plus, j'ai mis "Me.Resize" et "Me.Load" comme événement... En effet, en VB.NET ce n'est plus comme VB6 sur ce point. Les événements sont mis après "Handles" et le nom "Form1_Load" n'a plus d'importance. Tu peux écrire ce que tu veux à la place. Il me semble que tu n'es pas encore familier avec ça, d'après quelques allusions...

Amicalement,
Us.
Messages postés
491
Date d'inscription
mercredi 1 février 2006
Statut
Membre
Dernière intervention
18 novembre 2016
1
Bonjour,

Je déterre ce topic très instructif, mais qui me pose un soucis.
Je suis en VB 2010, avec ce code tiré de ce topic, mais j'ai une erreur d'instance.

Private ListLabel As System.Collections.Generic.SortedList(Of Integer, Label)
Private Sub PieceJointe_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

'declaration des controls
        Dim label_Dir As Label


        For x = 0 To 6

            'nouveau textbox
            label_Dir = New Label()

            With label_Dir
                .Name = "label_Dir" & x.ToString()
                .Width = 300
                .Height = 20
                .Location = New Point(10, x * 30)
                .BackColor = Color.White
                .Tag = x
            End With

            'ajout du controle au formulaire
            Me.Panel_PJ.Controls.Add(label_Dir)
            ListLabel.Add(x, label_Dir)    'Ligne en erreur

Next

....

End sub


"L'exception System.NullReferenceException n'a pas été gérée
Message=Object reference not set to an instance of an object."

Auriez-vous une idée?


Jimy

Pensez: Réponse acceptée
'**********************************************
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
Salut

Je déterre ce topic

avec une pioche

ce n'est pas plutot
Private ListLabel As New System.Collections.Generic.SortedList(Of Integer, Label)
Messages postés
491
Date d'inscription
mercredi 1 février 2006
Statut
Membre
Dernière intervention
18 novembre 2016
1
En effet, bien vu ShayW, merci! ;)


Jimy

Pensez: Réponse acceptée
'**********************************************