2010-06-10 3 views
0

J'ai trois usercontrols uc1.ascx, uc2.ascx, UC_Combined.ascxvaleur passe d'un contrôle utilisateur à un autre usercontrol

UC1 a un contrôle d'étiquette

UC2 a un contrôle DropDownList

UC_Combined est créé en combinant UC1 et UC2

maintenant, je placé UC_Combined.ascx sur ma page ASPX Webform1.aspx a un plus Étiquette ServerControl

Maintenant, quand je lance ma page WebForm1.aspx je peux voir voir la liste déroulante et une étiquette

Maintenant, quand je sélectionne un élément dans la liste déroulante, je veux la valeur de la sélection pour afficher l'étiquette

Can quelqu'un me suggère comment je peux le faire.

+0

par curiosité, qu'est-ce que vous essayez d'accomplir ici? Les contrôles utilisateur sont conçus pour réutiliser la logique sur plusieurs pages/contrôles. Il ne devrait jamais y avoir de dépendance entre les contrôles utilisateur (peut avoir parent/enfant - mais pas enfant/enfant) Pourquoi ne pas placer le contrôle/étiquette de liste déroulante dans le contrôle UC_Combined? – RPM1984

+0

Code s'il vous plaît. BTW vous pouvez utiliser 'Parent' pour accéder au contrôle parent, puis l'enfant que vous essayez d'accéder. –

Répondre

1

Il n'est pas préférable de créer une dépendance entre les contrôles parent et enfant. Quelque chose que vous devriez généralement éviter. Mais, si vous devez le faire ou d'une certaine façon vous facilite la vie, il y a quelques techniques pour y arriver tout en gardant les commandes un peu découplées. Je vous suggère de faire ce qui suit:

  1. Mettre en oeuvre un gestionnaire postback qui stockera la valeur du DropDownList dans la « Articles » collection du contexte HTTP (via HttpContext.Current.Items [ « ddlValue »] = val). La collection "Items" est une hashtable qui a une durée de vie d'une seule requête HTTP. Cela signifie qu'il est effacé après la réponse à la requête HTTP en cours. C'est un bon moyen léger de transporter des données entre les composants.
  2. Implémentez une propriété dans UC1 que lazy charge la valeur de la collection "Items" et référence la propriété dans votre balisage avec la syntaxe <% =%>. Le faire de cette façon garantit que vous n'essayez pas d'attraper la valeur jusqu'à ce que Render (qui est lorsque le code <% =%> soit exécuté), bien après que l'événement PostBack handler ait été exécuté et l'entrée "Items" ajoutée . De cette façon, vous pouvez tout faire dans le même PostBack.

Vous pensez avoir compris?

+0

Nice. +1Tirer le meilleur parti d'une mauvaise situation =) – RPM1984

1

Facile. Mettre en œuvre un événement sur le uc contenant le menu déroulant comme:

public event EventHandler<DDSelectionChangedEventArgs> DDSelectionChanged; 

    public virtual void OnDDSelectionChanged(DDSelectionChangedEventArgs e) 
    { 
     if (DDSelectionChanged != null) 
     { 
      DDSelectionChanged(this, e); 
     } 
    } 

La sélection a changé gestionnaire de dd doivent alors appeler OnDDSelectionChanged.

Enregistrez un gestionnaire sur cet événement dans votre page (aspx). Ce gestionnaire devrait alors appeler quelque chose comme ChangeText (texte) sur le second uc avec la zone de texte. Et la zone de texte a été mise à jour. Ainsi, la communication entre les UC est pilotée par des événements et la page a la possibilité de câbler les événements. Les UC sont complètement indépendants.