pb : Modifier un formulaire, par un evenement hors de ce formulaire.

pb : Modifier un formulaire, par un evenement hors de ce formulaire. - C#/.NET managed - Programmation

Marsh Posté le 26-07-2006 à 10:39:23    

Voila,  
 
Je souhaite modifier mon formulaire principal, lorsqu'il y a un evenement Click sur un lien d'un menu.
 
J'ai trouve un tutoriel qui reponds a ma question : http://csharpro.developpez.com/page10.php
Je l'ai suivis, mais j'ai maintenant un probleme lors de l'appel  ButtonClick(); il me met que je dois passer par l'expression new. :cry:  
 
Je debute en C#, j'ai pas l'habitude des delegates, et je ne vois pas comment resoudre ce probleme. j'ai essaye beaucoup de façon differente pour résoudre mon probleme, et celle là semble etre la meilleur, mais je vois pas comment résoudre ce probleme.
 
Merci beaucoup de votre aide. Je suis désole si il y a deja eu un post de creer, j'ai visite pas mal de vos page et je n'ai pas trouve de reponse. :jap:  

Reply

Marsh Posté le 26-07-2006 à 10:39:23   

Reply

Marsh Posté le 26-07-2006 à 14:36:31    

tu peux poster ton code stp ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 26-07-2006 à 14:54:59    

Voila mon UserControl avec le link, qui doit modifier notre formulaire principal:

Code :
  1. namespace Princ.AjoutPersonne.Menu
  2. {
  3.             public delegate void lAdmin_LinkClicked1(LinkLabelLinkClickedEventArgs e);
  4.          
  5.    public partial class MenuAjPers: UserControl
  6.    {
  7.        public lAdmin_LinkClicked1 EventClick;      
  8.        public MenuAjPers()
  9.        {
  10.            InitializeComponent();
  11.        }
  12.  
  13.        protected virtual void OnEventClick(LinkLabelLinkClickedEventArgs e)
  14.        {
  15.            if( EventClick != null )
  16.            EventClick(e);
  17.        }              
  18.  
  19.        private void lAdmin_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
  20.        {
  21.            OnEventClick(sender,e);
  22.        }        
  23.    }
  24. }


Et le formulaire principale :

Code :
  1. namespace Princ
  2. {  
  3.    public partial class FormulairePrincipal : Form
  4.    {
  5.        private static MenuAjPers Menu2;
  6.        public Accueil PageAccueil = new Accueil();
  7.        public Princ.AjoutPersonne.Admin Objlpers = new Princ.AjoutPersonne.Admin();
  8.       public FormulairePrincipal()
  9.        {
  10.            InitializeComponent();
  11.            this.PanelContenu.Controls.Add(PageAccueil);
  12.            PageAccueil.Dock = DockStyle.Fill;
  13.            PageAccueil.Visible = true;
  14.            Menu2 = new MenuAjPers();
  15.            Menu2.EventClick += new MenuAjPers.lAdmin_LinkClicked1(OnMenu2);
  16.         }
  17.  
  18.       public void OnMenu2(EventArgs e)
  19.        {
  20.            this.PanelContenu.Controls.Add(Objlpers);
  21.            Objlpers.Dock = DockStyle.Fill;
  22.            String nombre = "btlpers";
  23.            Visibilite2(nombre);
  24.        }
  25.  
  26. public void Visibilite2(String nb)
  27.        {
  28.            PageAccueil.Visible = false;
  29.            Objlpers.Visible = false;
  30.        switch (nb)
  31.            {
  32.                case "btlPers": ObjAjPersIP.Visible = true; break;
  33.                default: PageAccueil.Visible = true; break;
  34.            }
  35. }
  36. }


voila,  il y a un Program.cs , qui fait run de FormulairePrincipal.


Message édité par Schum444 le 26-07-2006 à 16:05:27
Reply

Marsh Posté le 26-07-2006 à 15:14:41    

j'ai mis ton code entre les balises dédiées, c'est plus clair
 
bon, plusieurs problèmes [:daplopbot] :
- la déclaration du délegate est mauvaise ligne 3. un delegate destiné à accueillir une callback d'évenement se présente de la façon suivante :

Code :
  1. public delegate void ClickEventHandler(object sender, EventArgs e) // EventArgs, ou toute classe héritant de EventArgs


tu as donc oublié le sender en paramètre
- les namespaces : il faut que tes classes soient dans le meme namespace, sinon ton delegate ne sera pas visible (sauf si tu spécifies explicitement le namespace)
- ligne 7 du UserControl : tu as oublié le mot clé "event"
- les fonctions OnEventClick  et lAdmin_LinkClicked du usercontrol sont inutiles (et en plus completement fausses). c'est à toi d'envoyer l'évenement une fois que la condition requise est satisfaite. en plus, tu as oublié de créer un objet LinkLabelLinkClickedEventArgs

Code :
  1. // l'action qui est supposée déclencher ton évenement est satisfaite : tu envoies donc un évenement aux souscripteurs
  2. LinkLabelLinkClickedEventArgs args = new LinkLabelLinkClickedEventArgs()
  3. if (EventClick != null)
  4.   EventClick(this, args);


 
passons maintenant au formulaire principal :
- ligne 18 : la signature de la fonction est mauvaise :

Code :
  1. public void OnMenu2(Object sender, LinkLabelLinkClickedEventArgs e)
  2. {}


bref, je t'encourage à lire un tuto sur l'utilisation des delegates et events :o


Message édité par Harkonnen le 26-07-2006 à 15:15:28

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 26-07-2006 à 16:09:03    

Merci pour ton aide deja Harkonnen, il y a encore 2 ou 3 petite chose, qui ne sont pas tres clair pour moi. *noobies rules*
 
Si je veux recupere le fait qu'une personne est cliquer sur mon lien, et declenche mon event a ce moment là. Si j'ai bien compris comment fonctionne C#, alors je dois creer une methode :

Code :
  1. private void NomDuLien_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
  2. {
  3.      //Et comme au moment ou est appelé cette méthode je veux que mon évenement se déclenche, je rajoute ces lignes la.
  4.      LinkLabelLinkClickedEventArgs args = new LinkLabelLinkClickedEventArgs()
  5.      if (EventClick != null)
  6.        EventClick(this, args);
  7. }


 
Est ce que je me trompe totalement, et que pour récupere le click sur mon lien je dois faire autrement?
Ou est ce que je dois bien declare ma methode, mais que je ne dois pas mettre mon action a cette endroit?
 
Et j'ai un autre probleme avec cette ligne :  

Code :
  1. LinkLabelLinkClickedEventArgs args = new LinkLabelLinkClickedEventArgs()


 il me dis que LinkLabelLinkClickedEventArgs() ne prends pas d'argument '0'.
 
Enfin est-ce, comme je suis dans deux namespace different je devrais écrire de cette maniere:

Code :
  1. Menu2.EventClick += new Princ.AjoutPersonne.Menu.MenuAjPers.lAdmin_LinkClicked1(OnMenu2);


 
Merci, pour tes réponses, et désole quelques fautes avait été rajouté, a cause de mes nombreux tests, qui n'ont aboutit à rien, a part m'embrouiller.

Message cité 1 fois
Message édité par Schum444 le 26-07-2006 à 16:09:29
Reply

Marsh Posté le 26-07-2006 à 16:27:48    

Schum444 a écrit :

Merci pour ton aide deja Harkonnen, il y a encore 2 ou 3 petite chose, qui ne sont pas tres clair pour moi. *noobies rules*
 
Si je veux recupere le fait qu'une personne est cliquer sur mon lien, et declenche mon event a ce moment là. Si j'ai bien compris comment fonctionne C#, alors je dois creer une methode :

Code :
  1. private void NomDuLien_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
  2. {
  3.      //Et comme au moment ou est appelé cette méthode je veux que mon évenement se déclenche, je rajoute ces lignes la.
  4.      LinkLabelLinkClickedEventArgs args = new LinkLabelLinkClickedEventArgs()
  5.      if (EventClick != null)
  6.        EventClick(this, args);
  7. }


 
Est ce que je me trompe totalement, et que pour récupere le click sur mon lien je dois faire autrement?
Ou est ce que je dois bien declare ma methode, mais que je ne dois pas mettre mon action a cette endroit?


tu te trompes totalement :o
tu confonds l'envoi de l'évenement et sa réception. le code que contient ta classe permet d'envoyer l'évenement EventClick aux classes qui y ont souscrit via l'opérateur +=. la signature de cette fonction correspond à une fonction qui reçoit l'évenement, or toi, tu l'envoies. donc tu n'as pas à mettre cet évenement dans une fonction : tu places juste tes 3 lignes de code à la suite de celles où tu détectes que l'utilisateur a cliqué sur le lien.
 

Schum444 a écrit :


Et j'ai un autre probleme avec cette ligne :  

Code :
  1. LinkLabelLinkClickedEventArgs args = new LinkLabelLinkClickedEventArgs()


 il me dis que LinkLabelLinkClickedEventArgs() ne prends pas d'argument '0'.


ben faut que tu construises ton objet avec les paramètres que tu as défini dans le constructeur de ta classe LinkLabelLinkClickedEventArgs [:jagstang]
 

Schum444 a écrit :


Enfin est-ce, comme je suis dans deux namespace different je devrais écrire de cette maniere:

Code :
  1. Menu2.EventClick += new Princ.AjoutPersonne.Menu.MenuAjPers.lAdmin_LinkClicked1(OnMenu2);



non, ton delegate est déclaré dans le namespace, pas dans la classe. là tu rajoutes en plus le nom de la classe.
il faut mettre

Code :
  1. Menu2.EventClick += new Princ.AjoutPersonne.Menu.lAdmin_LinkClicked1(OnMenu2);



Message édité par Harkonnen le 26-07-2006 à 16:28:38

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed