在运行时将TemplateField添加到GridView

时间:2012-01-06 20:40:15

标签: asp.net gridview user-controls

我有一组GridViews和DataSources共享多个列和设置,因此我将它们全部合并为一个UserControl,我给了DataControlFieldCollection以使我能够将列添加到aspx文件中。因此,我可以这样做:

<mine:PreGeneratedGridView runat="server">
    <Columns>
        <asp:BoundField DataField="mycolumn"
            HeaderText="My Header" SortExpression="mycolumn" />
    </Columns>
</mine:PreGeneratedGridView>

我正在使用此代码将其他列移至GridView PreGeneratedGridView中包含的UserControl中:

    protected void Page_Load(object sender, EventArgs e)
    {
        for (int i = 0; i < Columns.Count; ++i)
        {
            if (IsPostBack) myGridView.Columns.RemoveAt(i);
            myGridView.Columns.Insert(i, Columns[i]);
        }
    }

在每次加载页面时都要将列添加到GridView,但是当我尝试添加此列加载代码时,我觉得有点丑陋(并且可能会出现错误,尽管看似有效)进入Page_Init它会阻止类型TemplateField的列在PostBack期间运行(即列不为空,但标题不是)。

有没有办法在不使用Page_Load / IsPostBack的情况下加载我的列?

2 个答案:

答案 0 :(得分:0)

以下示例可以为您提供帮助。它使用一个实现ITemplate的类,并允许您使用EditItemTemplates向动态创建的TemplateFields添加控件。

How to add a ComboBox to an asp.net unbound GridView

答案 1 :(得分:0)

我不完全确定你在问什么,但是如果你的目标是在GridView中的TemplateField中显示字段,其中GridView绑定到匿名类型,你可以写这样的东西,使用Eval方法:

// Code to bind GridView
gv.DataSource = foo.Select( x => new {
    field1 = x.boomboom(),
    field2 = x.scramble() };
gv.DataBind;

<%-- code in your ASP.net codebehind --%>
    <asp:TemplateField>
        <ItemTemplate>
            <%# Eval("field1").ToString() %>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField>
        <ItemTemplate>
            <%# Eval("field12).ToString() %>
        </ItemTemplate>
    </asp:TemplateField>