1

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

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

2 回答 2

0

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

于 2013-09-11T03:14:39.363 回答
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 代码中的一个错误,该错误无法使用动态生成的网格视图中的模板字段正确管理视图状态。

于 2012-03-01T19:41:23.073 回答