2009-02-22 4 views
1

Je rencontre un problème lors de la configuration d'un événement sur un formulaire. Voici la configuration:Comment enregistrer des gestionnaires d'événements pour un contrôle utilisateur Web dans mon code?

On m'a donné une page avec deux contrôles, deux versions différentes d'un formulaire pour l'utilisateur final à remplir standard et avancé. Les deux formes ont un code et un javascript différents, donc le dev original les a mis dans des contrôles séparés d'utilisateur Web. Mis à part les contrôles est un LinkButton qui passe en mode avancé.

<uc1:Standard runat="server" ID="StandardForm" /> 
<uc1:Advanced runat="server" ID="AdvancedForm" /> 
<asp:LinkButton runat="server" ID="lnkAdvanced" Text="Go To Advanced" OnClick="lnkAdvanced_Click" /> 

lnkAdvanced_Click ne prend que toutes les informations actuellement entré à la pointe et flips le visible.

Mon problème est que l'un des patrons veut le bouton 'Aller à l'Avancé' dans le formulaire standard, mais le code .Visible est sur la page. J'ai donc pensé que cela pourrait être fait en utilisant un événement, mais cela ne semble pas fonctionner.

J'ai essayé de mettre en place l'événement comme celui-ci:

public event EventHandler AdvanceClick; 

protected void lnkAdvanced_Click(object sender, EventArgs e) { 
    AdvanceClick(sender, e); 
} 

Et quand cela ne fonctionne pas, j'ai essayé de mettre en place un délégué:

public delegate void AdvancedEventHandler(object sender, EventArgs e); 
public event AdvancedEventHandler AdvanceClick; 

Lorsque je me suis déplacé sur le bouton pour la forme standard, je devrait être en mesure de taper quelque chose comme:

StandardForm.AdvanceClick += new AdvancedEventHandler(GoToAdvanced); 

Mais il ne semble pas reconnaître une même ts dans le contrôle! Je reçois une erreur: "Standard ne contient pas de définition pour 'AdvanceClick' et aucune méthode d'extension 'AdvanceClick acceptant un premier argument de type' Standard 'pourrait être trouvé" Il trouve les autres propriétés très bien, je vais à ce sujet le mauvais façon?

+0

Comment avez-vous déclaré l'événement? – eglasius

+0

Quelque chose me dit que toute la configuration du contrôle est erronée, mais il est difficile de vous aider sans plus de détails. Je sais que vous avez déjà fourni plus de détails mais je ne pense pas que ça suffise. À tout le moins, vous devriez nous dire dans quels fichiers les différents extraits de code vivent ... page1.aspx, control1.ascx etc ... – JohannesH

+0

Merci à tous pour avoir confirmé que j'essayais réellement de le configurer de la bonne façon. Ne pas être capable de référencer l'événement me rendait fou. – Coronus

Répondre

0

Si le formulaire standard a le bouton "Passer à avancé". Puis, clairement, il doit connaître la forme avancée et donc ils semblent être assez étroitement couplés.Si tel est le cas, il me semble que vous pourriez tout aussi bien avoir la forme avancée en tant qu'enfant de la forme standard alors ... ou mieux encore, les fusionner en un seul contrôle. Si vous n'aimez pas ces options, vous pouvez créer un troisième contrôle qui héberge le bouton et les deux formulaires, ainsi que la logique pour déplacer les données entre eux et basculer leur visibilité.

Personnellement, je recommande l'option de contrôle unique. Avoir des contrôles étroitement couplés conduit généralement à la confusion sur la route. Vous pourriez assouplir la dépendance de diverses façons, mais réfléchissez bien avant de le faire.

Dans le projet existant sur lequel nous travaillons actuellement, nous avons plusieurs exemples tels que les formulaires de recherche et les résultats de recherche divisés en plusieurs contrôles, mais qui ont finalement besoin de fonctionner correctement. Comme je l'ai dit plus tôt, je ne recommanderai pas ce chemin.

+0

Ces contrôles n'ont pas besoin d'être étroitement couplés, si la logique est déléguée à la page hôte, alors le "mode avancé" peut être commuté à tout moment sans modifier le contrôle standard car seul l'hôte doit savoir quoi faire. C'est tout l'avantage d'exposer l'événement. –

+0

Combien d'utilisations pensez-vous qu'un bouton appelé "Go to advanced" aura? Je veux dire, ce n'est pas comme si elle allait passer à autre chose que la forme avancée. Si c'était le cas, je ne pense pas que le bouton ait quoi que ce soit à faire sur le formulaire standard qu'il devrait résider dans la page d'hébergement/le contrôle. – JohannesH

+0

Cette configuration sent juste drôle. Je ne pense pas que ce soit aussi compliqué que tout le monde essaie de le faire. J'aurais aimé en savoir plus sur les exigences de contrôles, les cas d'utilisation et leurs relations les uns avec les autres. Je devine juste que les contrôles standard et avancés ne sont pas destinés à être utilisés un à la fois. ;) – JohannesH

0

Vous ne devriez pas avoir besoin du délégué car vous avez créé un événement standard.

Essayez votre formulaire de charge ou à peu près:

StandardForm.AdvanceClick += new EventHandler(GoToAdvanced); 

Ensuite, quelque part sur la page qui héberge le 2 utilisateur contrôle

protected void GoToAdvanced(object sender, EventArgs e) 
{ 
    //Code that was previously in lnkAdvanced_Click on page. 
} 

Edit:

Cela ressemble à la configuration est faux.

Pouvez-vous publier le balisage de la page Hôte (à ce stade, nous supposons qu'il s'agit simplement des 2 contrôles utilisateur).

Ensuite, nous supposons également que l'événement AdvanceClick est déclaré dans l'UC standard, mais le message d'erreur indique qu'il n'est pas .. et la méthode lnkAdvanced_Click est dans l'UC standard? Ensuite, nous supposons que le code qui tente de se connecter à l'événement personnalisé est déclaré dans la page Hôte.

Si vous pouviez confirmer ou infirmer les hypothèses, je suis sûr que nous pourrions obtenir cette éclaircissement.

1
// in your Standard user control 
public event EventHandler AdvancedClick; 

private void lbtnAdvanced_Click(object sender, EventArgs e) 
{ 
    OnAdvancedClick(e); 
} 

protected void OnAdvancedClick(EventArgs e) 
{ 
    if (AdvancedClick != null) 
     AdvancedClick(this, e); 
} 

// on your page 
StandardForm.AdvancedClick += new EventHandler(StandardForm_AdvancedClick); 

private void StandardForm_AdvancedClick(object sender, EventArgs e) 
{ 
    // toggle logic here 
} 
+0

Cette approche accouple les formes standard et avancées au lieu de déléguer la logique à la page hôte. Tant que le couplage des commandes n'est pas un problème alors ok, mais j'éviterais généralement ceci quand ce n'est pas nécessaire. –

+0

convenu, je n'ai pas fait attention au fait que sa logique de bascule était sur la page. J'ai mis à jour ma réponse en conséquence. –

Questions connexes