2012-01-06 91 views
1

我有一组GridViews和DataSources共享几个列和设置,所以我将它们合并为一个UserControl,我给了DataControlFieldCollection以使我能够将列添加到aspx文件。因此,我可以这样做:在运行时将TemplateField添加到GridView

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

我使用这个代码移动其他列到GridView包含在我的PreGeneratedGridViewUserControl

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这种方式?

+0

我不明白你为什么要删除并重新插入它们回发。如果在回发中,您只是对表格列做任何事情,会发生什么? – 2012-01-09 01:34:25

+0

@Andrew:'TemplateField'列最终为空白,不包括头部。 – Brian 2012-01-09 03:58:14

回答

0

以下示例应该对您有所帮助。它使用实现ITemplate的类,并允许您使用EditItemTemplates将控件添加到动态创建的TemplateField。

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

+0

这并不能帮助我。我的问题不在于使用'TemplateField'本身。相反,我有一个已经工作,自包含的'TemplateField',并希望将整个'TemplateField'复制到'GridView'中。 – Brian 2012-01-06 21:00:09

0

我不能完全肯定你问什么,但如果你的目标是在GridView控件绑定到一个匿名类型一个GridView显示在TemplateField领域,你可以写类似这一点,使用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>