7

ObjectDataSource を指す DataSourceID を持つ GridView があります。ObjectDataSource は、ObjectDataSource コントロールの TypeName、SelectMethod、および SelectCountMethod プロパティを使用して、LINQ IQueryable を返すメソッドを指します。何が起こるかというと、データが事前に適切に読み込まれます。ただし、ポストバック時に、GridView から行を削除し、明示的な GridView.DataBind() を使用して再バインドしようとすると、機能しません。countmethod を呼び出して適切な行数を返すため、LINQ が適切な行数などを返していることはわかっています。簡単な例を次に示します。

<asp:GridView ID="TestGridView" runat="server" PageSize="20" 
    AutoGenerateColumns="false" AllowPaging="true" 
    AllowSorting="false" DataSourceID="TestDataSource">
    <Columns>
        ...
    </Columns>
</asp:GridView>

<asp:ObjectDataSource ID="TestDataSource" runat="server" 
    EnablePaging="true" SelectCountMethod="GetDetailCount" 
    SelectMethod="GetDetails" TypeName="MyApp.PageClass" />

ボタンを追加して TestGridView.DataBind(); を追加しようとしました。その方法。Page_PreRender イベントに追加してみました。何を試してもうまくいきません。

以下で誰かが提案したように、私はそれを Page_Load にも移動しようとしましたが、うまくいきませんでした。これが私のコードの大まかな例です:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // Set "initial" query parameters, then ...
        BindData();
    }
}

private void BindData()
{
    // EDITED: Removed the code below since I'm not looking to delete the
    //         rows from the database, but rather get the GridView to rebind
    //         which its not.
    ////Remove all current rows from the GridView
    //int colCount = TestGridView.Rows.Count;
    //for (int x = 1; x <= colCount; x++)
    //{
    //    TestGridView.DeleteRow(x);
    //}

    // Bind GridView to the ObjectDataSource
    TestGridView.DataBind();
}

protected void RegenerateImageButton_Click(object sender, ImageClickEventArgs e)
{
    // Set "updated" query parameters, then ...
    BindData();
}
4

6 に答える 6

13

グリッドビューはポストバック時に再バインドされず、それらの行はビューステートから引き戻されます。ページの読み込み時 (または初期化時) に gridview の DatasourceID をオブジェクト データ ソース ID にリセットすると、gridview が再バインドされます。

于 2010-08-18T14:34:51.160 に答える
3

ばかげた考えですが、ページ読み込みイベントを ? で確認しましたif(!Page.IsPostBack)か?

ASP.NET ページ フレームワークの概要から:

Page_Load:このイベント中に、一連のアクションを実行して、ASP.NET ページを初めて作成するか、投稿から生じるクライアント側イベントに応答できます。このイベントの前に、ページとコントロールのビュー状態が復元されました。IsPostBackページ プロパティを使用して、ページの処理が初めてかどうかを確認します。初めての場合は、データバインドを行います。また、コントロール プロパティを読み取り、更新します。

一方

Page_PreRender: PreRender イベントは、ビュー ステートが保存され、コントロールがレンダリングされる直前に発生します。このイベントを使用して、コントロールで直前の操作を実行できます。

実質的に

ページ フレームワークはステートレスで切断されたモデルであるため、クライアントが .aspx ページを要求するたびに、ページの処理中に多くのことが発生します ...

したがって、実際には、ビューステートが復元された後ではなく、ビューステートが設定される前にチェックを行うことができます。通常、確認する最も一般的な場所if(!Page.IsPostBack)は Page_Load イベントです。

于 2009-11-18T22:06:34.897 に答える
2

あなたの例は示しています

  TestGridView.Columns.RemoveAt(0); 

しかし、あなたは本当に意味がありましたか

  TestGridView.Rows.RemoveAt(0); 

(そして、これは問題ですか?)

于 2009-11-19T21:15:54.640 に答える
2

TreeView を XmlDataSource に動的にバインドすると、ポストバックごとに xml ソースが変更されるという同様の問題がありました。EnableCache を false に設定すると修正されました。これを試しましたか?(IQueryableがLinq2sqlオブジェクトを使用している場合、Linq2sqlオブジェクトはすでにキャッシュされていると考えてください)

<asp:ObjectDataSource ID="TestDataSource" runat="server" EnableCaching="false"
    EnablePaging="true" SelectCountMethod="GetDetailCount" 
    SelectMethod="GetDetails" TypeName="MyApp.PageClass" />

それがうまくいかない場合は、上記と組み合わせてこれを試してください:

protected override void OnPreRender(EventArgs e)
{
   base.OnPreRender(e);
   BindData();
}
于 2009-11-20T14:40:18.773 に答える
0

コード ビハインドをもう少し調べたところ、ページ プロパティの値が ViewState に格納されていることに気付きました。セッションに切り替えると、機能します。

于 2009-11-20T16:44:27.667 に答える
0

更新後にデータバインドを試みても、行の更新された値が表示されないという同様の状況がありました。

GridViewにバインドされていましたが、そのバッキング オブジェクトを からクエリObjectDataSourceに切り替えた後に問題が発生しましDataSetEntity Framework

を有効にすると、私にとってViewStateはうまくいきました。GridView

<asp:GridView ID="GridViewTransporters" PageSize="100"
runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" DataSourceID="ObjectDataSourceTransporters"
DataKeyNames="Id" EnableViewState="True">
于 2017-09-12T09:01:52.587 に答える