Récupérer les datas entré dans des textbox créées dynamiquement.

Messages postés
1
Date d'inscription
dimanche 2 décembre 2018
Dernière intervention
2 décembre 2018
-
Bonjour,

Mon problème est le suivant, je créé par l'appui sur un bouton, un certain nbre de textbox, dont le nbre dépend d'une valeur entrée dans une textbox existante.
ces textbox s'affichent sur 2 colonnes, la première colonne est rempli automatiquement par une formule lié a la valeur entrée dans la textbox existante, et la deuxième colonne devrait être rempli manuellement mais .....Pour ecrire le code désignant la variable des textbox, il me faut les noms de celles ci, et comme elles seront créees que quand j'appuierais sur le bouton.... les textbox n'existent pas encore !!!!, Le code ci dessous crée 2 colonnes de textbox et des labels en dessous, mais si je peux entrer des valeurs dans la deuxième colonne, je ne sais pas comment les recupérer en code !

Imports System.Data
Imports System.Data.OleDb
Imports System.ComponentModel
Imports System.Globalization
Imports System.Threading
Imports Microsoft.VisualBasic.PowerPacks
Imports Microsoft
Public Class Form1
    Dim coef As Integer
    Dim nbr As Single = 0
    Dim coeff As Single
    Dim vol As Double
    Dim x As Double
    Dim y As Double
    Public Property KeyChar As Char
    Public Property MyTextBox_v As Object
    Dim v As Single
    Dim result As Single
    Private ReadOnly MyShape As Control

    Public Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click


        coef = TextBox1.Text
        coef = coef / 0.5
        coeff = coef * 2
        vol = 0.5

        '****************** Textbox colonne 1 *************************

        For i As Integer = 1 To coef

            Dim MyTextBox As New TextBox


            Dim loc_x As Single = 50
            Dim loc_y As Single

            MyTextBox.Name = "xxx"
            MyTextBox.Size = New System.Drawing.Size(65, 22)
            MyTextBox.Location = New System.Drawing.Point(loc_x, loc_y + 30)
            MyTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
            Me.Controls.Add(MyTextBox)
            MyTextBox.Text = vol
            loc_y = loc_y + 30
            vol = vol + 0.5
            x = MyTextBox.Text



        Next

        ' ***************** textbox colonne 2 ***********************


        For q As Integer = 1 To coef

            Dim a As Integer = 1
            Dim TextBox(a) As TextBox
            Dim MyTextBox As New TextBox
            Dim loc_x As Single = 150
            Dim loc_y As Single
            Dim ax As Single

            MyTextBox.Size = New System.Drawing.Size(65, 22)
            MyTextBox.Location = New System.Drawing.Point(loc_x, loc_y + 30)
            MyTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center
            MyTextBox.Text = ax
            loc_y = loc_y + 30
            MyTextBox.AcceptsReturn = True
            MyTextBox.Name = (a)
            Controls.Add(MyTextBox)

            '   ax = ax + 1
            a = a + 1

            '  result = TextBox(a).Text
        Next


        ' ********************** Label axe des X ****************

        For i As Integer = 1 To coef

            Dim Mylabel As New Label
            Dim lab_x As Single
            Dim lab_y As Single = 250

            Mylabel.AutoSize = True
            Mylabel.Location = New System.Drawing.Point(lab_x + 20, lab_y)
            Mylabel.Name = "xxx"
            Mylabel.Text = "o"
            lab_x = lab_x + 30
            Me.Controls.Add(Mylabel)

            Mylabel.AutoSize = True
            Mylabel.Location = New System.Drawing.Point(lab_x + 20, lab_y + 10)
            Mylabel.Name = "xxxx"
            Mylabel.Text = vol
            vol = vol - 0.5
            lab_x = lab_x + 20
            Me.Controls.Add(Mylabel)

        Next


    End Sub


    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Application.Exit()

    End Sub
End Class


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Afficher la suite 

Votre réponse

2 réponses

Messages postés
12373
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 décembre 2018
0
Merci
Bonjour

en attendant qu'un modérateur édite ton message pour rendre ton code lisible (voir ce tutoriel pour tes prochains messages), voici quelques conseils.

VB.Net est un un langage tout objet. Tout est en italique, il ne plait pas à tout le monde, mais le fait est que chaque ligne de code utilise des objets, et que même un simple chiffre tapé dans le code dispose de méthodes.
dim un as String = 1.ToString()
ça fonctionne.
Utiliser une classe métier avec 2 propriétés (dont l'une dépend de l'autre), bindées sur tes textbox résoudrait ton problème. Cependant, il faut:
  • se forcer à penser objet
  • concevoir le programme dès le début dans cet optique

Mais une fois le pli pris, c'est bien plus simple que la programmation séquentielle ou événementielle, telle que semble être ton code.
Si tu veux plus d'infos sur le sujet, regarde mon profil, j'ai fait 2 tutos sur le binding et un sur l'objet. Ce ne sont certainement pas les meilleurs du net, mais je les ai fait exprès pour C# et VB.Net.

Si tu ne peux pas revoir ton programme depuis le début, l'association de 2 Textbox est il le plus simple à gérer?
Tu pourrais utiliser:
  • un DataGridView
  • une ListBox à colonne
  • une ListView

ou encore écrire un userControle, composé lui de 2 textbox, dans lequel tu fais tes calculs. C'est ce contrôle que tu ajouterais dynamique (et en plus c'est une approche plus objet, puisque tu crées un objet graphique)
Commenter la réponse de Whismeril
Messages postés
12373
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
12 décembre 2018
0
Merci
Maintenant que NHenry a rendu ton code lisible, merci à lui.

Pourquoi faire 3 boucles pour placer tes textBox, une seule suffit?

Un truc du genre
        For i As Integer = 1 To coef
            Dim textBoxGauche As New TextBox
            textBoxGauche.Name = String.Format{"Gauche{0:00}", i)

            Dim textBoxDroit As New TextBox
            textBoxGauche.Name = String.Format{"Droit{0:00}", i)

            Dim leLabel As New Label
            textBoxGauche.Name = String.Format{"Label{0:00}", i)

            'ect

Ainsi en une seule boucle tu génères tes 3 contrôles, tu leur donne un nom clair est unique.

Ici
        For q As Integer = 1 To coef

            Dim a As Integer = 1
            Dim TextBox(a) As TextBox

Ton tableau ne sert à rien, il n'est pas réutilisé dans le for, et est réinitialisé à chaque boucle/
Tu gâches juste de la mémoire.

A quel moment veux tu que le textbox de gauche soit rempli:
  • à chaque frappe dans celui de droite?
  • quand on tape une touche spécifique (entrée par exemple) dans celui de droite?
  • quand le textbox de droite perd le focus?
  • à l'appui d'un bouton?
  • autre?

Par ce que la réponse dépend essentiellement de ça.
Commenter la réponse de Whismeril

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.