2009-03-02 7 views
1

Comment invoquer la méthode publique du contrôle utilisateur à partir de la page?Méthodes publiques dans le contrôle utilisateur C# .net

Je charge dynamiquement le contrôle à l'intérieur de OnInit sur la page. Des idées? Pour une raison quelconque, je reçois une erreur de construction qui dit que la méthode n'existe pas, même si elle est publique. Commencer à penser que les contrôles de l'utilisateur ne valent pas tous les tracas.

+0

@gnomixa: Comment faites-vous l'appel? Est-ce à un type d'objet? Si vous créez dynamiquement, cela me crie la réflexion, auquel cas vous devez aussi appeler la méthode par réflexion, sauf si la méthode est sur une interface connue (classe de base ou interface). – casperOne

Répondre

5

Vous avez dit

Control fracTemplateCtrl = 
    (FracTemplateCtrl)LoadControl("FracTemplateCtrl.ascx") 
fracTemplateCtrl.TestMethod(); 

vous devez dire

FracTemplateCtrl fracTemplateCtrl = 
    (FracTemplateCtrl)LoadControl("FracTemplateCtrl.ascx") 
fracTemplateCtrl.TestMethod(); 

Notez que fracTemplateCtrl is déclarée comme FracTemplateCtrl, si visual studio sait qu'il a un TestMethod(). Quand il est déclaré comme Control, Visual Studio ne peut pas faire cette supposition.

+0

@gnomixa: Pas de problème. Notez que vous auriez obtenu votre réponse beaucoup plus rapidement si vous aviez posté votre code avec la question! ;] –

1

Jetez-vous le contrôle utilisateur au bon type?

1

Sans exemple de code, c'est difficile à dire, mais je suppose que vous avez besoin de faire référence à UserControl au type spécifique de votre contrôle personnalisé. Par exemple, si votre UserControl est de type « PersonControl », puis votre code ressemblerait à quelque chose comme ceci:

PersonControl ctl = (PersonControl)LoadControl("PersonControl.ascx"); 
ctl.DoCustomMethod(); 
+0

J'ai essayé la diffusion, mais cela ne fonctionnait pas non plus: Contrôle fracTemplateCtrl = (FracTemplateCtrl) LoadControl ("FracTemplateCtrl.ascx"); Form.Controls.Add (fracTemplateCtrl); Response.Write (fracTemplateCtrl.TestMethod()); erreur est que TestMethod est introuvable – sarsnake

+0

Votre fracTemplateCtrl doit également être de type FracTemplateCtrl, en plus de la distribution. Le code dans ce commentaire essaye d'appeler TestMethod sur une variable de type Control. –

0

Si votre classe hérite de UserControl, assurez-vous que lorsque vous y accéder, comme d'autres ont dit, vous le lancez correctement. Par exemple:

public MyControl : UserControl 
{ 
    public void MyMethod(){...} 
} 

dans votre formulaire:

private MyControl mycontrol = new MyControl(); 
private void MainForm() 
{ 
    this.Controls.Add(mycontrol); 

    InitializeComponent(); 
} 

private void DoStuff() 
{ 
    ((MyControl)mycontrol).MyMethod(); 
} 
0

La réponse de Mike est de savoir comment il est fait, mais Visual Studio peut être un peu bancal sur la détection de la classe UserControl, et se plaignent que le type ne exister. Dans ces situations, je dois ajouter une balise <% @Reference %> sur la page pour la forcer à reconnaître, même si elle peut être référencée dans le fichier web.config.

Questions connexes