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

C# Discussion :

Agir sur Form1(déjà chargé) à partir de Form2


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Par défaut Agir sur Form1(déjà chargé) à partir de Form2
    Bonjour à tous
    Ayant une bonne expérience en VB et nettement moins en VB.Net, je m’accroche pour faire des petites applications en C#

    J’ai deux formulaires Form1 et Form2
    Dans Form1, je peux agir sur Form2, au travers de frm2 que j’ai défini avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public Form2 frm2 = new Form2();
    Et pas sur les composants de Form2
    Par exemple frm2.button1 est refusé, je dois utiliser une routine public qui se trouve dans Form2 et que je lance par frm2.MaRoutine() ;
    C’est déjà un début.

    Mais pour faire pareil et agir sur Form1 en partant de Form2, là…. J’ai pas trouvé et je ne peux pas croire que cela ne soit pas prévu.

    Quelqu’un peut-il me dire comment faire ?

    Voici 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
    29
    30
     
    namespace Essai_sur_deux_formilaires
    {
     
        public partial class Form1 : Form
        {
            public Form2 frm2 = new Form2(); // Possible sur Form1, mais pas sur Form2
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                // Ces instructions fonctionnent parfaitement
                frm2.Show();
                frm2.Top = this.Top;
                frm2.Left = this.Left + this.Width;
                frm2.BackColor = Color.Aqua;
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                // Là aussi sans problème
                frm2.BackColor = Color.Red;
                frm2.MaRoutine();
            }
        }
    }
    et voici 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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    namespace Essai_sur_deux_formilaires
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                //Form1.BackColor = Color.AliceBlue; //N'est pas accepté par l'éditeur
            }
     
            private void button2_Click(object sender, EventArgs e)
            {
                Form1 frm1 = new Form1();
                frm1.BackColor = Color.Blue;
                // Aucune action visible. Poutant frm1 est bien définit en 
                //{Essai_sur_deux_formilaires.Form1, Text: Form1}
            }
            public void MaRoutine()
            {
                button1.BackColor = Color.Yellow;
                button2.BackColor = Color.Green;
            }
            private void Form2_Load(object sender, EventArgs e)
            {
     
            }
     
        }
    }

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Par défaut
    Si tu veux avoir accès a tes différents objet de Form1 et Form2 pourquoi met-tu des privates ?

    Public => Tout le monde peux les contacté
    Protected => Seulement lui-même et les enfants qui hérite
    Private => Seulement lui-même personne d'autre.

    L'utilisation du private est peut-être justifié mais si tu veux pouvoir y accéder depuis ailleurs il te faut faire des accesseur.

    J'espère que cela t'aide un peu ^^

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    Plusieurs choses:
    Il est possible de rendre les buttons "Public" dans le designer, il y a un parametre "modifier" je crois. Mais d'une manière général il vaut mieux que tu gardes "MaRoutine" niveau maintenance c'est mieux.

    La différence entre ton form1 et ton form2 c'est que form1 possède une référence sur form2 mais pas l'inverse.
    Du coup dans form2 tu instancie un nouveau Form1 qui n'a rien avoir avec celui qui est affiché.
    Le plus simple c'est d'ajouter un paramètre dans ton constructeur de Form2(Form1 referenceForm1) , puis de le stocker dans ta classe.
    Tu peux je pense également utiliser la propriété "Parent" de Form2 que tu cast en Form1. Mais bon si tu décides d'instancier Form2 depuis Form3...Ca ne marchera pas.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 93
    Par défaut
    Salut,

    Reprenons ton besoin : tu veux qu'une instance de Form1 connaisse une instance de Form2, et que cette instance de Form2 connaisse l'instance de Form1.

    Pour cela il faut que ta classe Form1 ait une propriété (disons F2) du type Form2, et que ta classe Form2 ait une propriété (disons F1) du type Form1.

    Ensuite dans ton code appelant, tu auras quelque chose de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Form1 frm1 = new Form1();
    Form2 frm2 = new Form2();
     
    frm1.F2 = frm2;
    frm2.F1 = frm1;
    Pour la problématique d'accès aux contrôles, il faut changer la propriété Modifier dans le designer.

    Bon code !

  5. #5
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Salut Claude,

    Je pense que techniquement c'est assez facilement réalisable comme tu as pu le voir dans les réponses précédentes (encore bien d'autres solutions existes).

    Afin de choisir celle qui s'appliquera le mieux à ton besoin, tu devrais nous en dire plus sur ta problématique à la base. Que doivent faire tes Forms? Pourquoi tes deux Forms doivent-ils se connaître?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Par défaut
    Je vous remercie de vos réponses

    A N4w4k
    Comme je ne voudrai pas mourir idiot et que le langage C m’a toujours effrayé, j’ai décidé, à 80 ans de m’y attaquer et je suis peut-être présomptueux
    Néanmoins j’essaye de commencer avec un petit programme extrêmement simple, (du moins en VB.Net). J’ai donc utilisé deux formulaires pour savoir ce que je pouvais en faire en les faisant travailler ensembles.
    Mais dès le départ, je me rends compte que ça n’est pas du tout pareil.
    Par exemple, comment déclarer des variables public accessibles dans toutes les classes.
    J’ai essayé, en vain de les déclarer dans program.cs, car il semble le 1er lancé.
    En gros, je fais des essais qui doivent me servir à apprendre la syntaxe.

    A Jaco67
    Pour cela il faut que ta classe Form1 ait une propriété (disons F2) du type Form2, et que ta classe Form2 ait une propriété (disons F1) du type Form1.
    Oui, mais comment.
    Un petit exemple sera le bienvenu.

    A micka132
    Le plus simple c'est d'ajouter un paramètre dans ton constructeur de Form2(Form1 referenceForm1) , puis de le stocker dans ta classe
    Même remarque que pour Jaco67.

    Pour tout le monde
    J’ai conscience de vous solliciter exagérément, veuillez me pardonner.

    Claude Azoulai

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Par défaut
    Quel est le but réél dans ton exemple ? Car il faut savoir en objet que l'association bidirectionnelle entre classes est fortement déconseillée car cela créé des dépendances. De plus sur des forms, je ne vois pas l’intérêt.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 93
    Par défaut
    Citation Envoyé par Claude_Azoulai Voir le message
    Oui, mais comment.
    Un petit exemple sera le bienvenu.
    Ta classe Form1 doit ressembler à quelque chose comme ça :
    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
    public class Form1 : Form
    {
    	private Form2 f2;
     
    	// Propriété
    	public Form2 F2
    	{
    		get { return f2;}
    		set { f2 = value;}
    	}
     
    	public Form1()
    	{
    		InitializeComponent();
    	}
     
    	// reste de l'implémentation
    }
    ... et quasiment la même chose pour Form2 !

    C'est vraiment pas loin de ce que tu avais proposé, sauf que l'initialisation de la variable se fera en dehors du formulaire (cf mon précédent post).

  9. #9
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    Voila j'ai repris ton code et ajouté les élements manquant

    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
    namespace Essai_sur_deux_formilaires
    {
     
        public partial class Form1 : Form
        {
            public Form2 frm2 = new Form2(this); // Possible sur Form1, mais pas sur Form2
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
               // Ces instructions fonctionnent parfaitement
                frm2.Show();
                frm2.Top = this.Top;
                frm2.Left = this.Left + this.Width;
                frm2.BackColor = Color.Aqua;
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                // Là aussi sans problème
                frm2.BackColor = Color.Red;
                frm2.MaRoutine();
            }
        }
    }
    Code c# : 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
    namespace Essai_sur_deux_formilaires
    {
        public partial class Form2 : Form
        {
     
            Form1 frm1 ;
            public Form2(Form1 formReference)
            {
                frm1 =formReference;
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                //frm1 .BackColor = Color.AliceBlue; //N'est pas accepté par l'éditeur
            }
     
            private void button2_Click(object sender, EventArgs e)
            {
     
                frm1.BackColor = Color.Blue;
                // Aucune action visible. Poutant frm1 est bien définit en 
                //{Essai_sur_deux_formilaires.Form1, Text: Form1}
            }
            public void MaRoutine()
            {
                button1.BackColor = Color.Yellow;
                button2.BackColor = Color.Green;
            }
            private void Form2_Load(object sender, EventArgs e)
            {
     
            }
     
        }
    }

  10. #10
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Citation Envoyé par Claude_Azoulai Voir le message
    Néanmoins j’essaye de commencer avec un petit programme extrêmement simple, (du moins en VB.Net). J’ai donc utilisé deux formulaires pour savoir ce que je pouvais en faire en les faisant travailler ensembles.
    Ok donc je pars du principe que tu fais juste un test pour découvrir ce que tu peux faire et comment tu peux le faire. Seulement je suis tout à fait d'accord avec djchou, je vois plus une impasse qu'autre chose

    Je vais peut être m'avancer un peu car je ne connais pas du tout le VB, mais je pense que ce que tu devrais regarder en premier est l'approche orientée objet et ses concepts. D'ailleurs tu devrais te procurer un très bon bouquin nommé Design patterns - Tête la première. Il regroupe tout les principaux design patterns (-> petit cours illustré en java). Fais quelques recherches sur internet et tu verras qu'on en dit le plus grand bien (en général pour son coté non-élitiste). Je ne sais pas si cela t'aidera pour cet exercice en particulier, mais pour ne pas mourir idiot c'est l'idéal

  11. #11
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 50
    Par défaut
    Citation Envoyé par -N4w4k- Voir le message
    Je vais peut être m'avancer un peu car je ne connais pas du tout le VB, mais je pense que ce que tu devrais regarder en premier est l'approche orientée objet et ses concepts.
    oui et particulièrement les principes d'encapsulation car il y a quelques erreurs dans ton code (différencier propriétés de classes et attributs)

    Je ne pense pas que un plongeon dans les design patterns dans leur ensemble soit une bonne idée car c'est un sujet très vaste et certains pattern ne sont pas forcement évident à saisir quand tu débute en .NET. Néamoins si tu veux savoir comment organiser le code de tes forms et les interactions entre elles regarde du coté du MVC et le MVP (un peu plus poussé)

Discussions similaires

  1. Rafraichir listview du form1 a partir du form2
    Par mactar85 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 30/05/2012, 17h45
  2. Réponses: 4
    Dernier message: 17/06/2010, 13h52
  3. agir sur une vue à partir d'une autre vue
    Par gasper06 dans le forum Flex
    Réponses: 1
    Dernier message: 26/05/2009, 15h13
  4. Réponses: 2
    Dernier message: 16/01/2008, 18h40
  5. [VB.NET]utiliser un composant situé sur form1 sur le form2
    Par Sytchev3 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 31/05/2006, 18h16

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