在PostBack期间,GridView丢失了列内容

时间:2012-02-23 09:14:48

标签: asp.net dynamic postback viewstate templatefield

我在回帖之间遇到 GridView 的问题。

真正的问题来自 TemplateField 我在列[0] 的标记中定义了一个子 CheckBox 控件。事情适用于第一次和第二次搜索执行。但是,在第二次执行和之后导致帖子返回的任何内容之间的某个时刻,我丢失了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>

2 个答案:

答案 0 :(得分: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代码中的一个错误,该错误无法在动态生成的网格视图中使用模板字段正确管理视图状态。

答案 1 :(得分:0)

基本上无法从ViewState正确恢复TemplateFields,如果以编程方式修改ASPX声明的列,则无法从声明中创建它们。 我可以使用的唯一解决方案是创建一个派生自TemplateField的新类,它在构造函数中将ItemTemplate设置为ITemplate派生类,这意味着必须以编程方式而不是声明性地定义模板。 您还可以在每次回发时重新绑定gridview,但这是它自己的蠕虫病毒。