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#] Acceder à la méthode d'une autre form


Sujet :

Windows Forms

  1. #1
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut [C#] Acceder à la méthode d'une autre form
    Bonjour,

    Je débute...

    J'ai deux forms, ma principale (Pri) qui est la MDI mère et une autre (Sec) qui est une MDI fille.

    Dans Pri, j'ai une méthode publique: "public void chargerDonnees()" qui recharge le dataGrid de Pri.

    Dans Sec, losque je fait des transactions, j'aimerais recharger le datagrid de Pri grace à la méthode: chargerDonnees(),
    mais elle n'est pas accessible, pourtant il voit Pri...
    Faut-il que je l'instancie dans Sec ?

    PS: je travaille en WinForms

    Merci d'avance.
    David.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 105
    Points : 134
    Points
    134
    Par défaut
    Hello,

    as-tu bien mis le modificateur public à ta méthode chargerDonnees() ? Si tu as utilisé un mot clé plus sécurisant (private, protected), ou rien mis du tout (private par défaut), c'est normal que tu ne puisses pas voir la fonction depuis une autre classe.

    a+

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 23
    Points
    23
    Par défaut
    si tu reutilise ta methode pourkoi ne ferai tu pas une classe pour gerer tout ca (acces au données et traitement des infos (datagrid ou autre )) ?

  4. #4
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut
    Salut smikar,

    Non, je l'ai déclarée comme indiqué ci-dessus, il y a bien public.

    J'essaye avec static, et elle devient bien visible depuis l'exterieur mais à l'interieur de cette fonction, je ne vois plus les composants (notament datagrid1) ni les méthodes de la form, même avec Pri.datagrid1, c'est fâcheux.

    Comment ça fonctionne ?
    David.

  5. #5
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut
    Salut deadliff,

    ça serait le même problème, je pense, je ne verrais pas plus les composants et les méthodes. De plus, je trouve ça dommage car c'est un traitement qui est vraiment attaché à Pri.

    Peux tu développer ton raisonnement STP car il se peut fortement que je n'ai pas bien saisi le fond de ta pensée.
    David.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    Expliquons par l'exemple :

    Form1 qui doit appelé une fonction de Form2.

    Il faut que Form2 ait la fonction en publique.

    Après il faut que Form2 ait une instance en mémoire.
    Form1 appelle cette instance :

    maForm2.FonctionPublic();

    Pour la fonction Static c'est normal puisque tes données sont faites pour une instance de ta Form et static est une fonction attachée à la classe et non à l'instance (pour faire simple)


    Form2 maForm2 = new Form2();
    Form2.fonctionpublic <= pas ok
    maForm2.fonctionpublic <= ok
    Form2.fonctionstatic <= ok
    maForm2.fonctionstatic <= ok

    voila

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 105
    Points : 134
    Points
    134
    Par défaut
    Au temps pour moi, dacid, j'ai lu ton post en diagonale et n'ai pas vu le public dans ton extrait de code. Heureusement SoaB est passé

  8. #8
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut
    Salut SoaB,

    Pour le static, c'est compris.

    Mais pour l'instance, je trouve ça bizarre, en fait, tu me dit de créer une instance pour recharger le dataGrid de Pri, je trouve ça bizarre car ça agit sur une autre Pri (Je suis confus).
    Tu me dis de faire ça:



    myPri = new frmPri();
    myPri.chargerDonnees();
    myPri.Dispose();

    Je l'ai fait mais ça ne marche pas, il passe bien dans la fonction mais ne rafraichit pas le dataGrid de Pri.
    David.

  9. #9
    Membre habitué Avatar de del-dongo
    Inscrit en
    Mai 2003
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 147
    Points : 183
    Points
    183
    Par défaut
    Lorsque tu fait apparaitre ta form2, tu lui as indiqué sa form parent, ta form2 possède donc une propriété parent de type Form, tu la caste en Form1.
    dans form2, tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((Form1) this.Parent).ChargerDonnees();
    voila j'espère que tu as compris...

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    Excuse moi j'ai pas lu ton post en entier

    PRi c'est une instance de ta Forme principale ?

    Sinon si c'est du MDI, tu récupères l'instance de Pri via Sec grace à un truc du style MdiParent ou un truc du genre

    style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Pri tmp = CType(Pri, sec.MdiParent)
    tmp.chargerDonnées()

  11. #11
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut
    Aie aie aie,

    Je dois avouer que l'idée est bonne mais j'ai essayé la façon de del-dongo et là, il me fait une erreur lors de l'éxecution. le très parlant:
    "La référence d'objet n'est pas définie à une instance d'un objet."
    Il ne rentre même pas dans la fonction:

    frmMain myPri;
    myFrm = ((frmPri) this.MdiParent); // c bon, il caste
    myFrm.chargerDonnees(); // là, il pête

    et de la façon de SoaB, il ne connait pas Ctype, mais je pense que ça reviendrait au même pb.

    Je ne suis tout de même pas le premier à vouloir faire qq chose de ce style ???

    Je viens de voir que dans l'espion express, il me met que la variable myFrm est hors de portée, ainsi que frmMain et this.MdiParent est null, c'est étrange car je l'ai bien affecté.
    David.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 105
    Points : 134
    Points
    134
    Par défaut
    CType c'est propre au VB.net donc dans ton cas oublie cela.

    Si tu as une telle exception, c'est que MdiParent n'est sûrement pas définit lors d'un appel à ce code. Vérifie bien que ton code n'est jamais appelé avant que tu aies ajouté ton formulaire enfant au parent.

    +

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    Oui normalement c'est bon. Si ca plante c'est que ta cinématique de développement n'est pas bonne.

    je sais que c'est bon car jai fais un projet y a moins de 1 mois avec du Mdi en C# tout pareil que toi quasiment
    ps : Je croyais que tu étais VB.net au temps pour moi.

  14. #14
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut
    ui, c'est le cas, je renseigne le mdiParent avant même le .Show.

    Mais je me disait que le this est peut-être le bouton (car le code se trouve à l'interieur d'un onClick), j'ai donc voulu mettre le nom de la classe frmSec mais il n'en veut pas.
    Je fait comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myFrm = ((frmMPri) frmSec.MdiParent); // ça pête
    j'ai appelé frmSec depuis frmPri comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    myFrmSec = new frmSec();
    myFrmSec.MdiParent = this;
    myFrmSec.Parent = dgMain;
    myFrmSec.Show();
    mais à l'interieur de la classe de frmSec, il ne connait pas l'instance, je ne peut pas faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myFrm = ((frmMPri) myFrmSec.MdiParent);
    Nan ?
    David.

  15. #15
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    Hello,

    L'astuce que j'utilise pour faire ce dialogue entre deux WinForm et la suivante:

    Si on part du principe que Form1 contient la fonction MaFonction que je souhaite appeler depuis Form2 il faut donc ajouter une référence de Form1 dans Form2.

    Moi j'utilise les constructeurs.

    En effet, dans Form2 on a:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Class Form2
     
     ...
     Public Sub New()
      ...
     End Sub
    Donc on ajoute le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Class Form2
      Inherits ...
     
      Private MyParent As Form1 = Nothing
     
      Public Sub New()
     
      End Sub
      Public Sub New(ByVal FormCaller As System.Windows.Forms.Form)
       ...
       MyParent = FormCaller
      End Sub
    Donc à ce moment dans Form1 on a la séquence habituelle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub Button1_Click(...)
     Dim oForm2 As New Form2
     oForm2.Show()
    End Sub
    Qui devient donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub Button1_Click(...)
     Dim oForm2 As New Form2(Me) 'Appel du deuxième constructeur
     oForm2.Show()
    End Sub
    Et donc depuis Form2 on a accès à toutes les propriétés et autres objets de Form1 en utilisant la variable MyParent.

    Voilà
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  16. #16
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut
    Très bien, je vois bien ce que tu fait, tu passes carrément toute la form1 dans le parmètre de construction de la form2, je me demande juste si c'est conventionnel (lourdeur, propreté, ...).

    Par contre, ça marche très bien, je te remercie.
    David.

  17. #17
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    C'est juste une référence à Form1
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Points : 157
    Points
    157
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    myFrmSec.MdiParent = this; 
    myFrmSec.Parent = dgMain;
    Non c'est Mdiparent faut pas faire l'autre.

    sinon MdiParent il saute je crois, surement pour ca que ca plante

  19. #19
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 063
    Points : 420
    Points
    420
    Par défaut
    ui, mais ce n'est pas les deux mêmes choses.

    La première, c'est pour dire que c'est bien une enfant MDI.

    la deuxième ligne c'est obligé, car mon parent MDI possède un
    dataGrid (dgMain) et si je ne met pas la deuxième ligne, la form se lançe bien, mais DESSOUS le dataGrid qui prends toute la page, on ne la voit donc pas.

    Je ne connais pas d'autre solutions pour contourner ce Pb
    David.

  20. #20
    Membre expérimenté Avatar de DotNET74
    Homme Profil pro
    Watch R&D Engineer & Apprenti .NET
    Inscrit en
    Août 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Watch R&D Engineer & Apprenti .NET

    Informations forums :
    Inscription : Août 2003
    Messages : 1 986
    Points : 1 453
    Points
    1 453
    Par défaut
    C'est quoi le soucis ?
    La Théorie c'est quand on comprends tout mais que rien ne fonctionne.
    La Pratique c'est quand tout fonctionne mais qu'on ne sait pas pourquoi !

    Si vous aimez ma réponse, cliquez sur la main verte Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. modifier un élément d'une form dans une méthode d'une autre form
    Par baldebaran dans le forum Windows Forms
    Réponses: 9
    Dernier message: 14/08/2009, 13h59
  2. Atteindre une méthode d'une Form à partir d'une autre Form
    Par Ishizaki dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/05/2008, 17h09
  3. Réponses: 1
    Dernier message: 23/07/2007, 10h47
  4. Comment acceder au control d'une form depuis une autre form?
    Par UnSofteuxAmateur dans le forum Windows Forms
    Réponses: 11
    Dernier message: 05/07/2007, 12h18
  5. Acceder a une TextBox qui se trouve sur une Autre Form
    Par le_contact dans le forum Windows Forms
    Réponses: 15
    Dernier message: 14/04/2007, 00h10

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