Comment ajouter un contrôle d'étiquette supplémentaire dynamiquement (ne doit être ajouté que sous certaines conditions). Je suis en train de faire quelque chose comme ceci:Ajouter dynamiquement un contrôle d'étiquette supplémentaire à un élément <ItemTemplate>
<asp:DataGrid id="dg" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateColumn SortExpression="Column1">
<HeaderTemplate>
<asp:LinkButton Runat="server" text="Column1 Hdr" ID="col1Hdr">
</asp:LinkButton>
</HeaderTemplate>
<ItemTemplate>
<asp:Label ID="col1Label" runat="server" Text='<%# Method1(DataBinder.Eval(Container.DataItem, "Column1").ToString(), DataBinder.Eval(Container.DataItem, "Column2").ToString()) %>' >
<asp:PlaceHolder ID="col2Holder" runat="server"></asp:PlaceHolder>
</asp:Label>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
Sinon, j'essayé de mettre l'espace réservé dans un modèle séparé:
<EditItemTemplate>
<asp:PlaceHolder ID="col2Holder" runat="server"></asp:PlaceHolder>
</EditItemTemplate>
mais en vain. Des astuces sur la façon de créer l'espace réservé seulement dans certains cas (comme pour certaines valeurs de Colonne1/Colonne2), plutôt que d'opter pour une approche répéteur ... Je reçois une exception de référence nulle mais cela a été résolu quand j'ai dû mentionner explicitement:
protected PlaceHolder col2Holder = new Placeholder();
au lieu de
protected PlaceHolder col2Holder;
Mais si method1 est en mesure de régler correctement la valeur de texte de la « Column1, il ne fait rien pour la valeur du Colonne2 ... y at-il quelque chose que je suis manquant ou existe-t-il une manière différente de faire ceci?
est ici le defn de method1:
public string Method1(string col1, string col2)
{
col1 += "Called method1";
Label col2label= new Label();
col2label.Visible = true;
col2label.Text = col2;
col2Holder.Controls.Add(col2label);
col2Holder.DataBind();
return col1;
}
Je recommande fortement de ne pas utiliser DataBinder.Eval - son lent et mal. Mieux vaut lancer le bon type et obtenir les données directement. Quoi lancer dépend bien sûr de votre DataSource mais disons que c'est un IEnumerable de DataRows, alors vous devez écrire ((DataRow) Container.DataItem) ["Column1"] au lieu de DataBinder.Eval (Container.DataItem, "Column1") –
la raison pour laquelle vous ne pouvez pas déclarer une variable nommée col2Holder sur le niveau de classe et attendez qu'elle contienne une référence à l'espace réservé dans votre ItemTemplate est qu'il y aura N nombre de ItemTemplates contenant chacun leur espace réservé unique. –
alors quel est un bon moyen de résoudre ce problème?J'ai besoin que le soit généré seulement dans certains cas, pas toujours. Merci! –