2012-02-23 2 views
1

У меня возникла проблема с поведением GridView между почтовыми серверами.GridView теряет содержимое столбца во время PostBack

Реальная проблема возникает из TemplateField я определяю в разметке в колонке [0] с ребенком CheckBox управления. Все отлично работает для первого и второго выполнения поиска. Однако в какой-то момент между вторым исполнением и тем, что вызывает сообщение после этого, я теряю содержимое TemplateField.

Его единственное содержимое столбца, а не весь столбец, который удаляется. TemplateField присутствует в источнике и показывает сформированный столбец в позиции 0 таблицы.

КОД:

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? –

ответ

0

Найдено ссылку, которая описывает подобную ситуацию.

https://connect.microsoft.com/VisualStudio/feedback/details/104994/templatefield-in-a-gridview-doesnt-have-its-viewstate-restored-when-boundfields-are-inserted#details

Они описывают ошибку в ASP.Net коде, который не сможет правильно управлять просмотр состоянием с полем шаблоном в динамически создаваемом виде сетки.

0

В принципе TemplateFields нельзя правильно восстановить из ViewState, и если вы модифицируете объявленные ASPX столбцы программно, они также не смогут создать их из объявлений. Единственным решением, которое я мог бы получить, было создание нового класса, полученного из TemplateField, который в конструкторе устанавливал ItemTemplate в класс, основанный на ITemplate, а это означает, что нужно определять шаблон программно, а не декларативно. Вы также можете перестроить gridview на каждом обратном вызове, но это его собственная возможность червей.