3

Page_Init で、いくつかのデータベース テーブルに基づいて動的に作成されたコントロールのテーブルを作成します。コントロールの 1 つは、リスト項目をリストの上に移動するための ImageButton です。このイベント ハンドラーが行うことは、影響を受けるアイテムのデータベース内の SortOrder 列を更新することです。

問題は、コントロールが Page_Init イベントで作成され、後で ImageButton コマンド イベントが発生したときに SortOrder が更新されることです。正しいSortOrderでテーブルを更新するための最良の手順は何ですか. イベントが発生した後にテーブルを再作成すると、ImageButton コマンド イベントが機能しなくなります。

  • テーブルを再作成せずにテーブル内のデータを更新する方法を実装する必要がありますか?
  • イベントが発生した後、コードでページをリロードする必要がありますか?

この問題を解決するためのあなたの好みの方法は何ですか?

4

3 に答える 3

8

Initやなどのページ イベントLoadは、ポストバックを発生させたイベント ハンドラーの前に常に発生します。これがページのライフサイクルの基礎です(Peter Bromberg による視覚的な表現については、こちらを参照してください)。ASP.NET を初めて使用するほとんどの開発者は、この "困惑" を理解して適切に処理する上で大きな問題を抱えています。

これを行う理想的な方法は次のとおりです。

a. データベース データに基づいてテーブルの作成を処理Page_Initするプロシージャを呼び出す必要があります (説明のために呼び出しましょう) 。BindData()このメソッドは、データベース データにバインドし、そのバインディングに基づいて UI 要素をレンダリングするバインディング メソッドに似ています。IOW、メソッドからテーブル作成コードを削除Page_Initし、別のメソッドに配置して、必要なときに呼び出すことができるようにする必要があります。

重要な注意:このBindData()メソッドは、動的に作成された ImageButton コントロールのイベント ハンドラーのコントロールへのアタッチも処理します。これを と呼びますImageButton_Click。これは、後続のポストバックで発生するイベントへのコントロールにとって重要です。

b. メソッドが実行されると、メソッドImageButton_Clickが呼び出さBindData()れてテーブルとそのバインディングが再作成されますが、新しい並べ替え順序ルールが適用されます。

したがって、最初のロード時の実行順序は次のとおりです。

  1. Page_Init
  2. BindData()

後続のロード (ポストバック時) での実行順序は次のとおりです。

  1. Page_Init
  2. BindData()- ImageButton のイベントハンドラが添付されました。
  3. ImageButton_Click
  4. BindData()
于 2009-04-23T08:09:13.807 に答える
4

このようなものが必要になります...

  • OnInit (IsPostBack = false)
    • ImageButton を動的に作成する
    • ワイヤアップ ImageButton イベント ハンドラ
    • テーブルの読み込み - セッション/変数の並べ替え順序を確認します。ない場合。デフォルトを使用する

ボタンをクリックします

  • OnInit (IsPostBack = true / 1 回目のポストバック)

    • ImageButton を動的に再作成する
    • ワイヤアップ ImageButton イベント ハンドラ
    • テーブルのロード - デフォルトのソート順で
  • ImageButton_OnClick (まだ同じ最初のポストバック)

    • テーブルのリロード - 特定のソート順で
    • このソート順変数を Viewstate/Session 変数に保存します

他のポストバックを引き起こす

  • OnInit (IsPostBack = true / 2 回目以降のポストバック)
    • ImageButton を動的に作成する
    • ワイヤアップ ImageButton イベント ハンドラ
    • テーブルの読み込み - セッション/変数の並べ替え順序を確認します。見つかった場合は、それを使用します。
于 2009-04-23T08:08:16.663 に答える
1

まず、データを手動で UI コントロールにバインドしているようです。Asp.Net には、組み込みのデータ バインディング手法を使用してこれを回避する多くの方法があります。GridView のような多くのコントロールでは、特定のデータ ソースから Html テーブルを自動的に作成できます。リピーターを含む他の多くのオプションがあります。

どのようにデータをバインドすることを選択しても、手法は、ページのライフサイクルを通じて毎回ある時点で再バインドすることです。

必要がある...

  1. デフォルトのソート順で最初のページ読み込み時にデータをバインドします
  2. 並べ替え順序が変更された後、イメージ ボタンのイベント ハンドラーでデータを再バインドします。

コードは次のようになります...

private void Page_Load (...)
{
    if (!IsPostBack)
        //On First Load
        BindData(defaultSoortOrder);
    else
        BindData(currentSortOrder);            
}

private void ImageButton_Click (...)
{
    currentSortOrder = newSortOrder;
    BindData(currentSortOrder);
}

Image ボタンをクリックすると、BindData を 2 回呼び出すことになります。ただし、ページのポストバックは任意のコントロールから開始される可能性があるため、これは必要です。ページの読み込み時に常にデータをバインドする必要があります。

于 2009-04-23T08:49:09.827 に答える