基本的に、コントロール (TextBox、DropDownList) を含む新しい列を GridView に追加するボタンが必要です。
これですでに十分に単純に思えます:
protected void btn_AddColumn_Click(object sender, EventArgs e)
{
TemplateField MyTemplateField = new TemplateField();
gv_SupplierPrices.Columns.Add(MyTemplateField);
}
このマークアップを追加したいとします。
<asp:TemplateField>
<ItemTemplate>
<table style="width:100%;">
<tr>
<td><asp:TextBox ID="tbox_ItemPrice" runat="server"></asp:TextBox></td>
</tr>
</table>
</ItemTemplate>
</asp:TemplateField>
これが問題です。.aspx ページのマークアップで作成した TemplateField を使用して、コード ビハインドの新しい列に追加するにはどうすればよいですか? 精巧なまたは派手なマークアップを作成できないため、コード ビハインドで TemplateField を作成したくありません。それらは、互いに隣り合っているコントロールのように見えます。とても醜いです。
PS 誰かが私が実際に何を作っているのか知りたい場合は、基本的に GridView を Excel のようなグリッドシートに変えています。新しい列はサプライヤーを表し、各行はサプライヤーが販売しているアイテムを表します。彼らはそれを望んでいます。なぜなら、彼らはそれを埋めている間、価格を並べて比較する方が簡単だからです.
更新:私はすでにそれを理解しました。マークアップで作成した TemplateField を表す分離コードから GridView の列を呼び出すだけで、それを追加できます。
<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>
コード ビハインドでは、マークアップで作成された TemplateField を表す列にアクセスし、新しいコピーのようにボタン クリックで再度追加できます。
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);
}