2010-08-13 4 views
0

j'ai une certaine logique que les boucles et ajoute un nouveau contrôle du panneau à un autre contrôle:Accès à plusieurs valeurs à partir du panneau généré

for (int segmentIndex = 0; segmentIndex < segments.Length; ++segmentIndex) 
{ 
    holder.Controls.Add(new Panel() { Width = Unit.Percentage(segments[segmentIndex]/segmentsSum * 100), CssClass = String.Format("segment segment-{0}", segmentIndex) }); 
} 
container.Controls.Add(holder); 

Cela fonctionne très bien, mais il y a quelques valeurs que je dois stocker sur chaque panneau dans la boucle. Je dois pouvoir accéder à ces valeurs dans C# et javascript, une fois que le contrôle est rendu sur la page. Quel serait le meilleur moyen d'y parvenir? J'ai déjà utilisé la propriété Tag sur certains contrôles, mais un Panel n'en a pas.

Merci beaucoup

Répondre

0

Ajoutez un HiddenField à votre panneau. Il sera affiché en HTML sous la forme <input type="hidden" /> donc il est invisible, accessible pour votre code serveur et aussi pour votre javascript.

LiteralControl innerContent = new LiteralControl("<p>Hello, World!</p>"); 
HiddenField hiddenContent = new HiddenField() { ID = "hiddenContent", Value = "My hidden content" }; 
p.Controls.Add(innerContent); 
p.Controls.Add(hiddenContent); 
+0

Puisque j'ai plusieurs valeurs recommanderiez-vous plusieurs HiddenFields ou un seul HiddenField avec les valeurs concaténées? –

+0

Peu importe aussi longtemps que le travail est fait. :-) Peut-être que créer plusieurs champs cachés est plus facile si vous voulez accéder aux données en javascript. Il peut également rendre votre code plus facile à lire et à comprendre. –

1

Il semble que vous devez ajouter des balises à l'intérieur du panneau, est-ce exact? Si tel est le cas, vous pouvez ajouter un contrôle à la collection Controls du contrôle Panel, par exemple Label ou LiteralControl.

Le code suivant (non testé) illustre ce point:

for (int segmentIndex = 0; segmentIndex < segments.Length; ++segmentIndex) 
{ 
    var p = new Panel() { ... }; 

    var innerContent = new LiteralControl("<p>Hello, World!</p>"); 

    p.Controls.Add(innerContent); 

    holder.Controls.Add(p); 
} 
container.Controls.Add(holder); 

Sinon, au lieu d'un LiteralControl vous pouvez ajouter une étiquette, un bouton ... tout ce dont vous avez besoin.

+0

Je ne pense pas qu'un LiteralControl peut être accessible à partir du serveur? –

+0

Votre point est bien pris, cependant. J'ai besoin de la plus petite empreinte disponible pour stocker ces valeurs. –

+0

@ sub13: Vous pouvez certainement utiliser un LiteralControl. Voir http://msdn.microsoft.com/en-us/library/system.web.ui.literalcontrol.aspx. Et LiteralControl peut utiliser la plus petite empreinte car vous pouvez définir précisément ce que vous voulez dans la propriété Text de LiteralControl (qui est ce qui est émis lors du rendu). –

Questions connexes