2012-01-06 130 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>