Fondamentalement, je veux un bouton qui ajoute une nouvelle colonne avec mes contrôles (c'est-à-dire TextBox, DropDownList) à mon GridView.Comment ajouter TemplateField créé dans le balisage .aspx à la colonne GridView dans le code derrière?
semble déjà assez simple avec ceci:
protected void btn_AddColumn_Click(object sender, EventArgs e)
{
TemplateField MyTemplateField = new TemplateField();
gv_SupplierPrices.Columns.Add(MyTemplateField);
}
que je veux ajouter ce balisage:
<asp:TemplateField>
<ItemTemplate>
<table style="width:100%;">
<tr>
<td><asp:TextBox ID="tbox_ItemPrice" runat="server"></asp:TextBox></td>
</tr>
</table>
</ItemTemplate>
</asp:TemplateField>
est ici le problème. Comment puis-je utiliser un TemplateField que j'ai créé dans le balisage sur ma page .aspx et l'ajouter à ma nouvelle colonne sur le code derrière? Je ne sais pas et je ne veux pas créer mon TemplateField sur le code parce que je ne serai pas capable de créer des balisages élaborés ou de fantaisie. Ils vont juste ressembler à des contrôles qui sont les uns à côté des autres. C'est très moche.
P.S. Si quelqu'un est curieux de savoir ce que je suis en train de faire, je transforme mon GridView en une feuille de calcul Excel. Les nouvelles colonnes représentent un fournisseur et chaque ligne représente un article que le fournisseur vend. Ils le veulent parce qu'il est plus facile de comparer les prix côte à côte pendant qu'ils le remplissent.
Mise à jour: je l'ai déjà compris. Je peux simplement appeler la colonne de mon GridView de codebehind qui représente le TemplateField que j'ai créé dans le balisage, puis je l'ajoute.
<asp:GridView ID="gv_SupplierTable" runat="server" AutoGenerateColumns="False"
DataKeyNames="Id" DataSourceID="TestTable_DS">
<Columns>
<asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False"
ReadOnly="True" SortExpression="Id" />
<asp:BoundField DataField="AccountType" HeaderText="AccountType"
SortExpression="AccountType" />
<asp:TemplateField AccessibleHeaderText="MyTemplateFieldCreated in Markup">
<ItemTemplate>
<table style="width:100%;">
<tr>
<td><asp:TextBox ID="tbox_ItemPrice" runat="server"></asp:TextBox></td>
</tr>
</table>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Puis, en codebehind, je peux accéder à cette colonne qui représente le TemplateField créé dans le balisage et l'ajouter à nouveau sur le clic de bouton, comme une nouvelle copie:
protected void btn_AddColumn_Click(object sender, EventArgs e)
{
DataControlField newColumn = this.gv_SupplierTable.Columns[2];
//this column at index #2 from my GridView represents
the TemplateField created in markup since the columns
at index #0 and index #1 are DataBound.
gv_SupplierTable.Columns.Add(newColumn);
}
Croyez-le ou non, c'est l'approche WAY SIMPLER. Précuisez toutes les colonnes et lignes dont vous avez besoin et cachez-les au moment de la conception. Ensuite, libérez-les au besoin de votre codebehind, et je suggère à l'intérieur de l'événement databound() – Fandango68