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

Windows Forms Discussion :

[C#] Accéder à éléments de form1 depuis form2


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut [C#] Accéder à éléments de form1 depuis form2
    Bonjour à tous !!
    Je suis tout à fait débutant en C# et je suis par conséquent confronté à un problème: Accéder aux méthodes et contenus des variables d'une form1 depuis une form2, appelée par form1.

    J'ai bien lu la faq C# parlant de :
    " Comment accèder à une méthode publique d'une form à partir d'une autre form créé par la première ? "

    Et j'ai tenter de reproduire la même chose.

    Dans form1.cs, j'ai les deux fonctions suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    publicvoid Throw_Form2(object sender, EventArgs e)
    {
    Form2 F2= newForm2();
    F2.Owner = this;
    F2.Show();
    }
    publicvoid TestPassage()
    {
    MessageBox.Show(this.maskedTextBox1.Text.ToString());
    }
    
    Et dans form2.cs, j'ai ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    publicpartialclassForm2 : Form
    {
    public Form2()
    {
    InitializeComponent();
    Form1 F1 = (Form1)this.Owner;
    F1.TestPassage();
    }
    
    }
    
    La compilation fonctionne mais lors de l'éxécution j'ai une erreur au niveau de l'appel de TestPassage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    La référence d'objet n'est pas définie à une instance d'un objet
    Pouvez vous m'aider ?? je ne comprends pas bien

    D'autre part, j'aimerai savoir s'il est possible de lire les contenu des variables crées dans form1, depuis form2, avec cette méthode ?

    Voilà ! merci grandement pour votre aide.

    PS: c'est mon premier poste en C#
    tout le monde est d'accord pour critiquer la pensée unique

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par LE NEINDRE
    La compilation fonctionne mais lors de l'éxécution j'ai une erreur au niveau de l'appel de TestPassage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    La référence d'objet n'est pas définie à une instance d'un objet
    Pouvez vous m'aider ?? je ne comprends pas bien
    Dans le constructeur de ton formulaire enfant le Owner sera toujours null je crois bien. Tu ne pourrais jamais y accéder depuis le constructeur.

    D'autre part, j'aimerai savoir s'il est possible de lire les contenu des variables crées dans form1, depuis form2, avec cette méthode ?
    Oui. Regarde ce sujet cela devrait te mettre sur la piste.
    Pas de questions techniques par MP

  3. #3
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par StormimOn
    Dans le constructeur de ton formulaire enfant le Owner sera toujours null je crois bien. Tu ne pourrais jamais y accéder depuis le constructeur.

    Oui. Regarde ce sujet cela devrait te mettre sur la piste.
    +1, la propriété Owner est défini APRES l'instanciation de l'objet
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Merci pour vos réponses claires et rapides !!!

    Dans un premier temps, pour ne pas placer le owner dans le constructeur de la form2, j'ai placé un bouton dans ma form2 qui définit le owner quand je clique dessus et appelle une méthode de la form1.

    J'ai fait comme ceci (dans form2):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public partial class Form2 : Form
    {
    public Form2()
    {
    InitializeComponent();
    }
    private void BeginTreatment(object sender, EventArgs e)
    {
    Form1 F1 = (Form1)this.Owner;
    F1.TestPassage();
    }
    
    Et ça fonctionne bien !!!

    Mais, je voudrais ne pas avoir à cliquer sur un bouton, je voudrais que mon traitement (qui doit aller chercher des données dans la form1) se lance dès la création de la form2.

    J'ai donc lu le post que tu m'as donné StormimOn, et j'ai cru comprendre que dans mon cas, je devais passer les données que je veux récupérer dans le constructeur de la form2.

    Est-ce bien cela qu'il faut faire ?
    Dans mon cas, ce sont les items d'une listbox que je veux passer.
    Est-ce possible ? Je ne serai pas contre un indice pour savoir comment les passer !!

    En tout cas, merci pour votre aide et désolé d'avance si les questions sont banales mais je suis néophytes.
    tout le monde est d'accord pour critiquer la pensée unique

  5. #5
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par LE NEINDRE
    Mais, je voudrais ne pas avoir à cliquer sur un bouton, je voudrais que mon traitement (qui doit aller chercher des données dans la form1) se lance dès la création de la form2.
    Utilise l'événement Load du formulaire enfant. A ce moment il sera instancié donc tu auras accès au Owner et tu pourras faire ce que tu souhaites je pense

    Tu pourrais également passer tes informations au constructeur, cela fonctionnerait aussi bien. Il suffirait de modifier le prototype du constructeur pour qu'il puisse prendre en argument ta collection d'items.
    Pas de questions techniques par MP

  6. #6
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par StormimOn
    Utilise l'événement Load du formulaire enfant. A ce moment il sera instancié donc tu auras accès au Owner et tu pourras faire ce que tu souhaites je pense
    cela dépend . Il n'auras accès au Owner que si le Show est fait après le form2.Ower = this.

    Citation Envoyé par StormimOn
    Tu pourrais également passer tes informations au constructeur, cela fonctionnerait aussi bien. Il suffirait de modifier le prototype du constructeur pour qu'il puisse prendre en argument ta collection d'items.
    perso je préfère cette solution dans ce cas .
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  7. #7
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Moi aussi je préfère la seconde solution, mais j'ai donné la première quand même pour information. Sachant qu'avant d'afficher un formulaire si on pense avoir besoin du parent on initialisera le Owner, il faut rester cohérent ^^
    Pas de questions techniques par MP

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Je vais donc essayer la seconde solution: passer au constructeur de la forms2 la collection d'items de la listbox (appartenant à la form1).

    Cependant, je lutte depuis hier pour récupérer la collection (d'ailleurs c'est quoi une collection d'items: un tableau, un objet bizarre, un hashage ?)

    Dans ma listbox, j'arrive à:
    - insérer un élément
    - supprimer un élément
    - lire un élément

    Je n'arrive pas à:
    - lire le dernier élément (connaitre l'indice du dernier élément)
    - récupérer en une fois tous les éléments (je ne sais pas dans quoi ça va être récupérer)

    Auriez vous une explication sur cette collection d'items ?
    tout le monde est d'accord pour critiquer la pensée unique

  9. #9
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    récupérer en une fois tous les éléments (je ne sais pas dans quoi ça va être récupérer)
    maListBox.Items te renverras une ListBox.ObjectCollection

    lire le dernier élément (connaitre l'indice du dernier élément)
    maListBox.Items.Count renvoie le nombre d'Item. Il suffit de soustraire 1 pour avoir l'index en base zéro.
    Pas de questions techniques par MP

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Citation Envoyé par StormimOn
    maListBox.Items

    maListBox.Items.Count renvoie le nombre d'Item. Il suffit de soustraire 1 pour avoir l'index en base zéro.
    Je viens à l'instant de tomber sur listbox.items.count !!
    J'ai un peu honte là ...

    Je récupère cela, je le passe dans un tableau que je donne au contructeur de la form2, je teste et reviens mettre résolu dès que ça marche !!

    Merci pour ton aide !!!
    tout le monde est d'accord pour critiquer la pensée unique

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Oups , désolé de revenir mais j'ai un petit souci visiblement.

    Dans ma form1 (récupération des données listbox dans un tableau et appel de la 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
    24
    25
    26
    27
    28
    publicpartialclassForm1 : Form
    {
    publicstring [] _myTab;
    public Form1()
    {
    InitializeComponent();
    InitializeTooltip();
    }
    
    publicArray TestPassage()
    {
    _myTab = newstring[listBox1.Items.Count];
    for (int i = 0; i < listBox1.Items.Count; i++)
    {
    _myTab[i] = listBox1.Items[i].ToString();
    }
    return _myTab;
    }
     
     
    publicvoid Throw_Form2(object sender, EventArgs e)
    {
    Form2 F2= newForm2(_myTab);
    F2.Owner = this;
    F2.Show();
    }
    

    Dans la form2 (surchage ?? du constructeur et affiche du tableau dans un messagebox)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    publicpartialclassForm2 : Form
    {
    public Form2()
    {
    InitializeComponent();
    }
    public Form2(Array my_tab) : this()
    {
    MessageBox.Show(my_tab.ToString());
    }
    }
    
    ça marche pas ...

    L'erreur est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    La référence d'objet n'est pas définie à une instance d'un objet.
    tout le monde est d'accord pour critiquer la pensée unique

  12. #12
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    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
    33
    34
    35
    36
    37
    38
    39
    40
    publicpartialclassForm1 : Form
    {
    publicstring [] _myTab;
    public Form1()
    {
    InitializeComponent();
    InitializeTooltip();
    }
    
    publicArray TestPassage()
    {
    _myTab = newstring[listBox1.Items.Count];
    for (int i = 0; i < listBox1.Items.Count; i++)
    {
    _myTab[i] = listBox1.Items[i].ToString();
    }
    return _myTab;
    }
     
     
    publicvoid Throw_Form2(object sender, EventArgs e)
    {
    Form2 F2= newForm2(this.TestPassage());
    F2.Owner = this;
    F2.Show();
    }
    
    publicpartialclassForm2 : Form
    {
    public Form2()
    {
    InitializeComponent();
    }
    public Form2(Array my_tab) : this()
    {
    MessageBox.Show(my_tab.ToString());
    }
    }
    
    si tu n'appelles pas ta méthode de remplissage de ton tableau ça marche pas ...
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  13. #13
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Passe tu biens dans TestPassage ? Car à mon avis ce ne doit pas être le cas est ton tableau n'est jamais initialisé. Essaye ainsi dans un premier temps

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void Throw_Form2(object sender, EventArgs e)
    {
        string[] _myTab = new string[listBox1.Items.Count];
        for (int i = 0; i < listBox1.Items.Count; i++)
        {
            _myTab[i] = listBox1.Items[i].ToString();
        }
        Form2 F2 = new Form2(_myTab);
        F2.Owner = this;
        F2.Show();
    }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
    
        public Form2(string[] my_tab) : this()
        {
            MessageBox.Show(my_tab.Items.Count.ToString());
        }
    }
    Aussi, puisque tu utilises le Framework 2.0, tu peux remplacer les string[] par List<string> à la rigueur.
    Pas de questions techniques par MP

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Oulala !!
    Toutes mes confuses, le post de dessus ne voulait rien dire !!

    Maintenant ça fonctionne !!!

    Voilà le code:
    Dans form1.cs
    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
    publicpartialclassForm1 : Form
    {
    publicstring [] _myTab;
    public Form1()
    {
    InitializeComponent();
    InitializeTooltip();
    }
    publicstring [] TestPassage()
    {
    _myTab = newstring[listBox1.Items.Count];
    for (int i = 0; i < listBox1.Items.Count; i++)
    {
    _myTab[i] = listBox1.Items[i].ToString();
    }
    return _myTab;
    }
    publicvoid Throw_Form2(object sender, EventArgs e)
    {
     
    Form2 F2= newForm2(TestPassage());
    F2.Owner = this;
    F2.Show();
    }
     
    }
    
    et dans form2.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    publicpartialclassForm2 : Form
    {
    public Form2()
    {
    InitializeComponent();
    }
    public Form2(string [] my_tab) : this()
    {
    MessageBox.Show(my_tab[0].ToString());
    }
    }
    

    Merci beaucoup pour votre aide !!!!!!!

    Bonne appétit et bonne aprem
    tout le monde est d'accord pour critiquer la pensée unique

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Oui le post que j'avais écris avant était totalement faux !!!

    Maintenant j'ai compris. j'ai appelé testpassage qui renvoie un string[] dans les paramètres du constructeur.

    De plus, j'avais confondu array et string[] qui ont l'air d'être deux choses totalement différentes. Donc en fait, tout ceci ne voulais rien dire.

    Merci encore pour l'aide !

    PS: je crois bien que j'ai encore un long chemin devant moi !!
    tout le monde est d'accord pour critiquer la pensée unique

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

Discussions similaires

  1. Recharger le form1 apres insertion depuis form2
    Par lucaazori1988 dans le forum VB.NET
    Réponses: 4
    Dernier message: 16/09/2010, 16h02
  2. Modifier variable Form1 en temps réél depuis form2
    Par furtif1 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/11/2009, 09h59
  3. Accéder aux objets de la form1 depuis une class
    Par Jimmy_S dans le forum Windows Forms
    Réponses: 6
    Dernier message: 23/03/2007, 22h47
  4. Comment accéder à une DLL COM depuis un exécutable ?
    Par Denys dans le forum API, COM et SDKs
    Réponses: 10
    Dernier message: 20/09/2005, 08h04
  5. Réponses: 2
    Dernier message: 28/10/2004, 16h54

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