【问题标题】:GridView loses column contents during PostBackGridView 在 PostBack 期间丢失列内容
【发布时间】:2012-03-13 16:19:00
【问题描述】:

我在回发之间遇到 GridView 的行为问题。

真正的问题来自一个 TemplateField,我在 column[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>

【问题讨论】:

  • 你能提供你的aspx代码吗?

标签: asp.net dynamic postback viewstate templatefield


【解决方案1】:

找到一个描述类似情况的链接。

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

他们描述了 ASP.Net 代码中的一个错误,该错误无法使用动态生成的网格视图中的模板字段正确管理视图状态。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2011-05-29
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      相关资源
      最近更新 更多