2012-02-23 50 views
1

我在Post Backs之間有一個GridView的行爲問題。在回發期間GridView丟失列內容

真正的問題來自於的TemplateField我在標記在柱[0]的小孩複選框控制定義。對於第一次和第二次搜索執行情況,事情都很好。但是,在第二次執行和任何導致後面的帖子出現之後的某個時刻,我會丟失TemplateField的內容。

它只是列的內容而不是整個列本身被刪除。 TemplateField出現在源文件中,並在表格的位置0處顯示一個格式化的列。

CODE:

protected void ExecuteSearch(object sender, EventArgs e) 
{ 
    if (lb_SelectedFields.Items.Count == 0) { return; } //if no selected fields 

    //Generates custom SQL query based on user inputs and column Selections 
    BuildQuery(); // sets txbSqlText.Text = to the SQL string 

    DataTable Table = SqlAdapter.Select(new System.Data.SqlClient.SqlCommand(txbSqlText.Text)); 

    for (int i = gv_SearchResults.Columns.Count - 1; i > 0; i--) 
    { gv_SearchResults.Columns.RemoveAt(i); } //removes all the columns except[0] 

    foreach (ListItem Item in lb_SelectedFields.Items) //adds all the user defined columns 
    { 
     //Column object that is able to find the column definition 
     Column Col = ColumnsBasedOnFocus.FindColumName(Item.Value); 

     if (Col.Type == "HyperLink") { gv_SearchResults.Columns.Add(CreateHyperLinkField(Col)); } 
     else { gv_SearchResults.Columns.Add(CreateBoundColumn(Col, true)); } //true is if the column is visable 
    } 

    gv_SearchResults.DataSource = Table; 
    gv_SearchResults.DataBind(); 
} 

ASP.NET:

<asp:GridView ID="gv_SearchResults" runat="server" GridLines="None" CellSpacing="0" 
    CellPadding="0" AutoGenerateColumns="false" CssClass="TABLE_LIGHTBLUE" Width="100%"> 
    <HeaderStyle CssClass="TABLE_LIGHTBLUE_HEADERROW" /> 
    <Columns> 
     <asp:TemplateField ItemStyle-Width="30" ItemStyle-Wrap="false"> 
      <HeaderTemplate> 
       <center> 
        <asp:Button ID="btn_SelectAll" runat="server" OnClick="SelectAll" Text="All" CssClass="TEXT_SMALL" /> 
        <asp:CheckBox ID="chk_Placeholder" runat="server" Visible="false" /></center> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <center> 
        <asp:CheckBox ID="chk_Select" runat="server" Visible="true" /> 
        <asp:Label ID="lbl_AssetGID" runat="server" Visible="false" Text='<%# Bind("i_GID") %>' /></center> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 
+0

你能提供你的aspx代碼嗎? – 2012-02-23 09:23:19

回答

0

基本上,TemplateFields無法從ViewState正確恢復,並且如果以編程方式修改ASPX聲明的列,則無法從聲明中創建它們。 我能工作的唯一解決方案是創建一個從TemplateField派生的新類,它在構造函數中將ItemTemplate設置爲ITemplate派生類,這意味着必須以編程方式而不是聲明方式定義模板。 您也可以重新綁定每個回發的gridview,但這是它自己的蠕蟲。