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

Messages postés
3
Date d'inscription
dimanche 2 décembre 2018
Dernière intervention
18 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

3 réponses

Messages postés
12415
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 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
12415
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 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.
PierLeca
Messages postés
3
Date d'inscription
dimanche 2 décembre 2018
Dernière intervention
18 décembre 2018
-
Merci pour vos réponses, en fin de compte j'ai trouvé, grâce à un ami,

dans une form1


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

maCIclone.NumberFormat.NumberDecimalSeparator = "."
Thread.CurrentThread.CurrentCulture = maCIclone

imax = TextBox1.Text
imax = imax * 2
vol = imax / (imax * 2)
vol1 = imax - vol

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

For i As Integer = 1 To imax


Dim MyTextBox As New TextBox
Dim loc_x As Single

If imax > 4 Then
loc_x = 900
Else
loc_x = 550
End If

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 + 50)
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


'on crée une liste de TB qui à ce stade est vide c'est juste un contenant
Public tblist As New List(Of TextBox)
Public imax As Byte 'quantité max de tb

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

'Remplissage de la liste avec des TB

imax = TextBox1.Text - 1
For i = 0 To imax
Dim tbtemp As New TextBox

'ici on peut personnaliser (taille...)

tblist.Add(tbtemp)
Next

' à la fin, on a Imax tb en réserves, prêts à être utilisés
' il reste à les ajouter sur la form
'Ajouts des TB sur la form

For i = 0 To imax
tblist(i).Location = New Point(20, 70 + i * 30)
Me.Controls.Add(tblist(i))
Next

'Voilà, les TB sont affichés, prêts pour la saisie

End Sub


'valide les saisies, et ouvre une deuxième form qui va lire le contenu des tb...

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Form2.Show()
End Sub

dans une form2

Public Class Form2
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Me.Close()
End Sub

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ListBox1.Items.Clear()
For i = 0 To Form1.imax
ListBox1.Items.Add(Form1.tblist(i).Text)
Next
End Sub
End Class

voila ca fait ce que je voulais,
Commenter la réponse de Whismeril
Messages postés
12415
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 décembre 2018
0
Merci
en fin de compte j'ai trouvé, grâce à un ami,


Forcément tu n'as pas répondu aux questions que je t'ai posées....

Et tu n'as pas non plus appliqué la procédure pour rendre ton code lisible. pour rappel
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Un forum est animé par des bénévoles, si tu veux qu'ils aient envie de t'aider il faut leur faciliter la vie:
  • un code illisible -> on passe à la question d'un autres
  • un truc qu'on ne comprends, on lui demande, il répond pas-> tant pis pour lui


PierLeca
Messages postés
3
Date d'inscription
dimanche 2 décembre 2018
Dernière intervention
18 décembre 2018
-
Bon, tout d'abord merci d'avoir bien voulu essayer de m'aider, et c'est vrai que je n'ai pas appliqué la procédure pour avoir un code correct, est ce que j'ai une excuse, j'aurai tendance à dire oui, je m'explique, car vous ne pouviez pas le deviner.

Pour mon boulot, je me trouve dans un trou perdu au fin fond de l'Afrique, sur l'ile de Pate "Pate island" au Kenya pour ceux qui connaisse, je suis déjà bien heureux d'avoir une connexion internet, même si celle çi est d'une lenteur .... escargotesque.

Quand j'ai posté mes deux messages, la fenêtre du site était presque en mode programmation,c.a.d. aucune balise, aucun graphique, que du texte, et bien sur rien sur la façon d'entrer du code, sinon je l'aurai fait, mais comme je disais vous ne pouviez pas le savoir.

Par contre j'aurai un petit reproche à faire, ne le prenez pas mal, ça n'a rien de personnel ça ne vise personne, et ça concerne bcp de forum de programmation.

Si on est ici et si on pose des questions "basiques" c'est que l'on ne sait pas !, alors j'aurai bien répondu à ta question, Whismeril, mais si j'ai fais comme ça c'est parce que je ne savais pas faire autrement !, pour les autres questions, j'avais expliqué dans la première message, mais dans l'élan de ma question je n'ai pas du être clair, j'avais un prof en école qui disait "quand on n'a pas compris c'est que ça a été mal expliqué". j'ai donc mal expliqué.

Pour essayer être plus clair, le programme est destiné à faire une courbe avec en X des volumes et en Y des pressions, je sais ce qu'on va me dire,
"on ne fait pas de courbe en vb.net !"
mais j'en ai fais, ca marche mais ça mouline pas mal !!!!, alors si vous pouvez me dire avec quoi faire des courbes ?

Sinon, une fois le test physique terminé, je connais le volume pompé, à quel débit (constant) et j'ai noté les pressions a chaque palier de débit.
par exemple, j'ai pompé 5 bbls à 0.5 bpm, j'ai noté la pression tous les 0.5 bpm.

Donc dans mon programme je rentre le volume pompé (5 bbls), et je voulais que le programme me crée deux colonnes de textbox, chaque colonne ayant le nbre de textbox correspondant au volume divisé par le débit (5/0.5=10) et qu'il remplisse la colonne de gauche automatiquement avec l'incrémentation des débits, 0.5, 1, 1.5, etc. afin qu'il ne me reste plus qu'a entrer les pressions dans les textbox de doites en face des vol. correspondant.

j'arrivais donc à créer mes deux colonnes et celle de gauche se remplissait toute seule, mais je ne savais pas comment récupérer les valeurs entrée dans les textbox de droite (pression), puisque elles étaient crées quand j'entrais le volume max, et donc je ne pouvais pas leur attribuer une fonction dans la mesure ou elles n'existaient pas lors de l'écriture du programme.
je suis ingé (c'est pas une référence !) mais pas en informatique loin de la !!!

j'espère avoir été plus clair, et si vous pouviez, vous les vrais informaticiens/programmateurs/etc vous mettre au niveau des pauvres béotiens que nous sommes, on apprécieris vraiment.

Dans tous les cas merci, et si mon code complet intéresse quelqu'un ?, je veux bien le partager ( création de courbe inclus).
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.