2017-02-02 4 views
2

私はWeb Formsプロジェクトに取り組んでいます。これは、この時間のために抽象化がたくさん追加された古いものです。私のページの1つには、ページ区切り付きのグリッドビューがあります。私は、現在の実装を、ユーザーが次のページに行くときに、現在のgridviewページで何かが変更されているかどうかをチェックして拡張しようとしています。私は2つのセッション変数を使ってこれを行うことができたと思う。私の問題はRowDataBoundイベントに移入され、それらの一つであり、そして元ASP.NETセッション上で、いくつかの抽象化があるのでRowDataBoundイベント内の私のコードは次のようになります。これは非常に最後に呼び出されRowDataBoundの最後の呼び出しでSession変数を更新します。

SessionWrapper.GetInstance().RemoveSessionItem("OriginalData"); 
SessionWrapper.GetInstance().SetSessionItem("OriginalData", someData); 

RowDataBoundの実装では、例えば私の場合、私の場合、グリッドビューはページあたり10レコードを表示するので、キーを10回削除した直後に、someDataのコレクションがRowDataBoundの各呼び出しに追加された更新データを追加します。

私がしたいのは、RowDataBoundの最後の実行である方法を見つけて、上記の手順を1回だけ実行することです。私は1ページに10ページがあることを知っているので、カウンタを実装してチェックすることができますが、最後のページに10レコード未満のレコードがある場合、または合計レコードが10レコード未満の場合はどうなりますか?

RowDataBoundの最後の呼び出しがいつ確実に確認されるのですか?

+0

あなたは 'DataBound'イベントを試しましたか?最後の 'RowDataBound'が呼び出された後に起動する可能性があります。 – Tim

+0

@Tim No.「RowDataBound」の後に適切なイベントがあると思っていましたが、どちらを使用できるのかわからなかったので、これは可能な解決策だと思います。それ以外に 'RowDataBound'を使うことは可能でしょうか? – Leron

+0

私の頭の上から外して考えることができる唯一の他の方法は、RowDataBoundがクラスレベル変数を介して呼び出され、最後のセッション項目を実行する回数を追跡することですが、それは深刻なものですクルージングとかなり脆い。私はまずDataBoundを試してみて、それが本当にすべてのRowDataBoundイベントの後に起動するかどうかを調べます。 – Tim

答えて

3

私はSessionの更新を行うためにDataBoundを使用してお勧めします。このような何か:

protected void GridView_DataBound(object sender, EventArgs e) 
{ 
    SessionWrapper.GetInstance().RemoveSessionItem("OriginalData"); 
    SessionWrapper.GetInstance().SetSessionItem("OriginalData", someData); 
} 

これはsomeDataは、このメソッドのスコープでアクセス可能であることを前提としています。そうでない場合は、クラスレベルの変数またはセッションに格納する必要があります。

3

RowDataBoundフッター行を使用すると、その行の数がわかります。

int counter = 0; 

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.Header) 
    { 
     counter = 0; 
    } 
    else if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     counter++; 
    } 
    else if (e.Row.RowType == DataControlRowType.Footer) 
    { 
     Label1.Text = counter + " rows in GridView"; 
    } 
} 
+0

フッターがない場合はどうなりますか?これは壊れます。 –

+0

"RowDataBound Footer rowを使用している場合"は、使用していないとこのソリューションは動作しないことを明確にしているようです..... – Tim

+0

最初は 'ShowFooter ="でテストしました「RowDataBound」の 'DataControlRowType.Footer'で' e.Row.Visible = false; 'で非表示にしますが、グリッド内のフッターの有無にかかわらず、常に実行されているようです。 – VDWWD

関連する問題