1

ポストバック間のGridViewの動作に問題があります。

実際の問題は、子のCheckBoxコントロールを使用してcolumn[0]のマークアップで定義したTemplateFieldに起因します。1回目と2回目の検索の実行では問題なく動作します。ただし、2回目の実行とその後の投稿の原因となるものの間のある時点で、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

同様の状況を説明するリンクが見つかりました。

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 に答える
0

基本的に、TemplateFieldsはViewStateから適切に復元できず、プログラムでASPXで宣言された列を変更した場合、宣言からもそれらを作成できません。私が作業できる唯一の解決策は、コンストラクターでItemTemplateをITemplateから派生したクラスに設定する、TemplateFieldから派生した新しいクラスを作成することでした。つまり、宣言ではなくプログラムでテンプレートを定義する必要があります。各ポストバックでグリッドビューを再バインドすることもできますが、それはワームの独自の缶です。

于 2013-09-11T03:14:39.363 に答える