基本上,我想要一个按钮,将带有我的控件(即 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 的网格表。新列代表供应商,每一行代表供应商正在销售的商品。他们希望这样,因为在他们填满的时候更容易并排比较价格。
更新:我已经想通了。我可以简单地从代码隐藏中调用我的 GridView 的列,该列代表我在标记中创建的 TemplateField,然后添加它。
<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);
}