2

基本上,我想要一个按钮,将带有我的控件(即 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);
    }
4

3 回答 3

1

在您的位置上,我会考虑硬着头皮研究以编程方式创建模板化字段。这会很麻烦,但是一旦你完成了,你就完成了。当然,您希望将它们抽象为辅助类或单独的控件。

于 2012-10-01T22:01:19.823 回答
1

您可以切换每列的可见性。

gv_SupplierPrices.Columns[10].Visible = true;
于 2012-10-01T15:46:56.977 回答
0

这里有几个关于动态添加列的例子GridView

protected void Page_Init(object sender, EventArgs e)
{
    btnAddColumn.Click += new EventHandler(btnAddColumn_Click);

    BoundField temp = new BoundField();
    temp.DataField = "Source";
    temp.HeaderText = "Source";
    temp.SortExpression = "Source";

    gv.Columns.Add(temp);
}

void btnAddColumn_Click(object sender, EventArgs e)
{
    TemplateField temp = new TemplateField();
    temp.HeaderText = txtNewColumn.Text;

    txtNewColumn.Text = string.Empty;

    gv.Columns.Add(temp);
}

ASPX:

<div>
    <asp:TextBox ID="txtNewColumn" runat="server" />
    <asp:Button ID="btnAddColumn" runat="server" Text="Add Column" />
</div>
<asp:GridView ID="gv"
    runat="server"
    AutoGenerateColumns="False"
    DataSourceID="dsExceptions">
    <Columns>
        <asp:BoundField DataField="Message" HeaderText="Message" />
    </Columns>
</asp:GridView>

<asp:ObjectDataSource ID="dsExceptions"
    runat="server" 
    SelectMethod="GetExceptions"
    TypeName="WebApplication.Data.MyDataContext" EnablePaging="True" 
    SelectCountMethod="GetExceptionCount" >
    <SelectParameters>
        <asp:Parameter Name="maximumRows" Type="Int32" />
        <asp:Parameter Name="startPageIndex" Type="Int32" />
        <asp:Parameter Name="startRowIndex" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

我的 ObjectDataSource 只是获取Exceptions我创建的集合,因此您可以忽略这部分代码。

所以我通过Page_Init处理程序中的代码添加一列,以及添加一个标题文本设置为txtNewColumn. 但是,关于这一点的一件事是,如果您刷新页面,它将丢失您使用页面上的按钮添加的列。您需要在按钮单击事件处理程序中添加一些代码来存储新列,因此它们总是在GridView重新加载时出现。由于听起来这些列代表供应商,因此您可能只想添加一个表单以供某人将供应商添加到您的系统中。供应商被保存在某处的数据库/数据存储中,在 中Page_Init,您从该数据存储中获取所有供应商并循环它们,为供应商创建模板字段。它会是这样的:

// I am just creating a list here, you would pull the vendor names in from the 
// datastore here instead.
var vendors = new List<string> { "Vendor A", "Vendor B", "Vendor C" };
foreach (var vendor in vendors)
{
    TemplateField temp = new TemplateField();
    temp.HeaderText = vendor;
    gv.Columns.Add(temp);
}
于 2012-10-01T22:13:14.263 回答