IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Passage de paramètres entre 2 Forms. [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut Passage de paramètres entre 2 Forms.
    Bonsoir, Désolé si ma question peux paraître basique mais les questions de base peuvent aussi être les plus importantes pour produire un bon code et je pense aussi que ça va intéresser beaucoup de monde. J'ai fait un exemple simple avec un code minimaliste pour bien comprendre qu'elle est le meilleur moyen pour passer 1 paramètre (que j'ai nommé Param) d'une Form1 vers une Form2.

    J'ai aussi d'autres impératifs qu'il serait trop long à expliquer mais que j’évoquerais peut-être en fonction de vos suggestions.
    Pour l'instant il s'agit de faire simple sachant que dans mon programme mon Paramètre ne sera pas une simple String mais des objets ou des variables que je n'ai pas encore définis précisément. Dans l'idée il faut pouvoir modifier le paramètre depuis Form1 et que l'on puisse relire celui-ci dans Form2. Bien sûre on pourrait utiliser la variable public Param dans les 2 Form mais est-ce la bonne façon de faire ?.

    J'ai fait un code simple en utilisant Byref pour passer le paramètre mais apparemment ça ne suffit pas. Pourtant il me semblait que en utilisant byref on pouvait déclarer plusieurs variables pointant vers la même donnée en mémoire.

    Le code de Form1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Class Form1
        Public Parametre As String
        Public MaForm2 As Form2
        Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
            Parametre = TextBoxParamètre.Text
            MaForm2 = New Form2(Parametre)
        End Sub
        Private Sub TextBoxParamétre_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBoxParamètre.TextChanged
            Parametre = TextBoxParamètre.Text
        End Sub
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles ButtonShoxForm2.Click
            MaForm2.Show()
        End Sub
    End Class
    Le code de Form2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Public Class Form2
        Private _Paramètre As String
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
        End Sub
        Public Sub New(ByRef Param As String)
            Call Me.New()
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            _Paramètre = Param
        End Sub
     
        Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Call Refresh()
        End Sub
     
        Private Sub ButtonRefresh_Click(sender As System.Object, e As System.EventArgs) Handles ButtonRefresh.Click
            TextBoxParamètre.Text = _Paramètre
        End Sub
    End Class

    Merci beaucoup pour vos conseils et suggestions.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Par défaut
    Salut,
    Tu peux utiliser le pattern Singleton

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    Merci chaparo, je ne connaissais pas les Singleton.
    A priori je n'ai pas vraiment trouver de solution qui puisse s'adapter à toute les situations.
    Finalement je vais faire suivant ce modèle :
    (A noter que je fait l’économie du variable Public pour Param et je m'assure que le formulaire Form2 ne puisse pas se fermer).

    Le Code de Form1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Class Form1
        Public MaForm2 As New Form2
        Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        End Sub
        Private Sub TextBoxParamétre_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBoxParamètre.TextChanged
            MaForm2.Paramètre = TextBoxParamètre.Text
        End Sub
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles ButtonShoxForm2.Click
            MaForm2.Show()
        End Sub
    End Class
    Le Code de Form 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Public Class Form2
        Private _Paramètre As String
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
        End Sub
     
        Public Property Paramètre() As String
            Get
                Return _Paramètre
            End Get
            Set(ByVal value As String)
                _Paramètre = value
                Call LoadData()
            End Set
        End Property
     
        Private Sub Form2_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            Me.Hide()
            e.Cancel = True
        End Sub
     
        Private Sub Form2_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Call LoadData()
        End Sub
        Private Sub LoadData()
            TextBoxParamètre.Text = _Paramètre
        End Sub
    End Class

  4. #4
    Membre éprouvé Avatar de Razorflak
    Homme Profil pro
    Développeur Flex/AS3
    Inscrit en
    Juin 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Flex/AS3
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 97
    Par défaut
    Autrement se que tu peux faire pour ne pas passer par des variables global, tu ajoute un constructeur à ta Form2 qui prend en paramètre une instance de ta Form1. De la tu pourras avoir accès et modifié tout se que tu veux sur ta Form2 depuis ta Form1.

  5. #5
    Membre Expert Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Par défaut
    Tu peux passer les paramètres (texte, tableau, objet,...) voulus dans le constructeur de form2. Tu pourras ainsi les récupérer et effectuer les opérations désirées.
    EDIT: grillé par Razorflak

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    Tu peux passer les paramètres (texte, tableau, objet,...) voulus dans le constructeur de form2. Tu pourras ainsi les récupérer et effectuer les opérations désirées.
    Oui mais le passage de paramètres s'effectue au moment ou on instancie le formulaire Form2. Ensuite, après que Form2 soit instancié, si l'on modifie la valeur du paramétre dans Form1 cette valeur n'est pas répercuté dans Form2. Donc le seul fait de passer le paramétre dans le New() ne suffit pas a créer un lien entre les 2 Form malgré le fait que l'on passe le paramètre à l'aide de "Byref".

    De plus je viens de faire une découverte importante qui remets en cause ce qui est noté dans un ouvrage pourtant très sérieux : (Manuel de référence Visual Basic de Francesco Balena).

    Contrairement a ce qui est écrit en page 80 le type string n'est pas un type référence :
    En effet, si on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            Dim s1 As String = "Valeur1"
            Dim s2 As String = s1
            s1 = "Valeur2"
            Debug.WriteLine(s2) 'Retourne Valeur1"
            Debug.WriteLine(s2 Is s1) ' Retourne False
    On s'appercois que s1 est s2 ne pointent pas vers la même donnée malgré la déclaration s2=s1.

    C'est peut-être pour cela que mon code du 1er Post ne fonctionne pas. Quelqu'un peux confirmer ? Y a t'il eu des changements dans le framework ou c'est moi ?

  7. #7
    Membre éprouvé Avatar de Razorflak
    Homme Profil pro
    Développeur Flex/AS3
    Inscrit en
    Juin 2013
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Flex/AS3
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 97
    Par défaut
    String est un type primitif, c'est pour cela que sa te retourne false, si tu fais la même chose pour un objet (un des controle de ta Form par exemple), ta 2e variable pointera bien vers ton premier objet.

  8. #8
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    Vois ton code de façon linéaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Dim s1 As String = "Valeur1" 'La machine met "Valeur1" à s1
            Dim s2 As String = s1 'La machine dit que s2 a la valeur de s1 à cet instant t
            s1 = "Valeur2" 'La machine dit que s1 a une nouvelle valeur à cet instant t+1
            Debug.WriteLine(s2) 'Retourne Valeur1"
            Debug.WriteLine(s2 Is s1) ' Retourne False
    Pour retourner True il faudrait réactualiser la valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Dim s1 As String = "Valeur1" 
            Dim s2 As String = s1 
            s1 = "Valeur2" 
            s2 = s1 '***
            Debug.WriteLine(s2) 'Retourne Valeur1"
            Debug.WriteLine(s2 Is s1) ' Retourne true

    Et idem pour les formulaires. ('fin à peu près là c'est de l'ihm)

    Ensuite, après que Form2 soit instancié, si l'on modifie la valeur du paramétre dans Form1 cette valeur n'est pas répercuté dans Form2
    Si dans l'instance de Form1 que tu as passé en paramètre à Form2 tu fais Form1.BackColor = SuperDark, ton formulaire n'aura pas changé de couleur de lui même, mais avec un .Refresh() il se redessinera en SuperDark.

    Et c'est ce qu'on a fait dans ma version de ton exemple avec s2 = s1 '***

  9. #9
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    Il y a plusieurs moyens de faire ce que tu souhaites.

    On peut :
    • Passer les paramètres dans une surcharge du constructeur du form (pour plusieurs paramètres c'est Public Sub New(ByRef toto As Form1, ByRef SuperString As String, ByRef JeSaisPasQuoi As Object, ByRef [...]))
    • Faire un module qui contiendra tes variables de travail accessibles depuis les 2 forms
    • Rajouter des properties à tes formulaires
    • Passer par des variables hautes Shared (ou pire, Public)(Je le dis parce que c'est une solution, mais c'est plutôt déprécié et pas franchement propre ...)



    Après certaines solutions sont plus adaptées que d'autres relativement à l'application, sa finalité, le but des paramètres, etc.

    En ce qui me concerne (et ce que je dis n'est pas parole d'évangile), j'évite les Modules et les variables hautes autant que peut se faire. (Même si parfois je m'autorise dans des petites appli éphémères.

    Je me sers principalement des properties. (Que tu peux aussi remplir avec les paramètres que tu auras passé au constructeur) Il y a beaucoup d'ouvertures avec.

    Exemple si ton form travaille principalement avec un objet Personne tu n'auras plus qu'à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Private _laPersonne As Personne
        Public Property laPersonne As Personne
            Get
                Return _laPersonne
            End Get
            Set(value As Personne)
                _laPersonne = value
            End Set
        End Property
    Et dans ton code tu pourras faire TextBox1.Text = laPersonne.NomPrenomOu même simplement avoir un property dans ton form2 qui travaille avec l'objet personnne de ton Form1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        Public Property laPersonne As Personne
            Get
                If Form2 IsNot Nothing Then
                    Return Form2.laPersonne
                Else
                    Return Nothing
                End If
            End Get
            Set(value As Personne)
                If Form2 IsNot Nothing Then
                    Form2.laPersonne = value
                Else
                    Form2.laPersonne = Nothing
                End If
            End Set
        End Property

    Bref, tout est possible et chaque problème a plusieurs solutions dont certaines plus adaptées que d'autres.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] passage de paramètre entre les Forms
    Par youssefcss dans le forum C#
    Réponses: 2
    Dernier message: 09/03/2015, 19h20
  2. Passage de paramètre entre 2 form
    Par megamario dans le forum VB.NET
    Réponses: 7
    Dernier message: 09/06/2009, 18h06
  3. Passage de paramètres entre form
    Par thierry007 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/02/2007, 12h21
  4. [Forms 6i] Passage de paramètres entre forms
    Par tmcgrady dans le forum Forms
    Réponses: 8
    Dernier message: 18/03/2006, 03h04
  5. [Forms]Passage de paramètre entre Forms et Reports
    Par jack554 dans le forum Reports
    Réponses: 4
    Dernier message: 30/03/2004, 13h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo