0

ASPとそのライフサイクルで繰り返し問題が発生します。これは、Page_Loadイベントが発生する前にイベントをキャッチすることです。たとえば、ここでは、gridViewクラスから継承するgridviewをカスタマイズしています。ジャンプするページを選択するためのドロップダウンリストを追加します(PageIndexChanged)。このドロップダウンリストのSelectedIndexChangedイベントがレンダリング後に呼び出されることを除いて、すべてが素晴らしいでしょう(グリッドとドロップダウンはポストバックごとに再生成されます)。そのため、適切な値を選択できません。

したがって、私のイベントは2回目のポストバックでのみ発生し、常に1回のポストバックで遅れます。

そのドロップダウンはRowCreatedイベントに追加されます。私は他のイベントで試しましたが、遅すぎるか早すぎるか(遅すぎるとレンダリングされない、早すぎると要素が欠落する)。

解決策はありますか?

PS:私は私を助けることができるこの記事を見つけました、しかし私はそれをする方法がわかりません:

制御または継承/拡張を行う際に考慮すべきポイント:

  1. base.CreateChildControls()を呼び出すCreateChildControlsをオーバーライドして、イベントを発生させるアイテムを作成してから、必要な操作を行う必要があります(つまり、場合によっては行を追加します)。
  2. リストアイテムDataBindingは、提示する方法が非常に...コーシャではありません.... DataBind()をオーバーライドして子をクリアし、EnsureChildControls()を呼び出してから、新しい行を追加することで、単純化する必要があります...このようにうまくViewStated、永続化、およびイベント管理。はるかに簡単です。
  3. アイテムをもう一度リストします。子を早めに作成しないでください。OnInitまたはonLoadで子コントロールを直接作成しないでください。それは間違い。最善の方法は、必要なときにシステムにEnsureChildControlsを呼び出させることです(最初のページの読み込み時にPreRenderで、子のイベントがある場合はPostBackで、OnInitの直後に呼び出します)...さらに悪いことに、OnInit、OnLoad EnsureChildControls()を呼び出します。
4

2 に答える 2

1

あなたが求めている msdn ページはASP.NET Page Life Cycle Overviewです。ページのライフサイクル全体で発生するすべてのイベントを示す便利なテーブルがあります。

次のいずれかが必要になる可能性があります (上記のリンクから)。

PreInit

開始ステージが完了した後、初期化ステージが開始する前に発生します。

このイベントは、次の目的で使用します。

  • IsPostBack プロパティをチェックして、ページが初めて処理されるかどうかを判断します。この時点で、IsCallback および IsCrossPagePostBack プロパティも設定されています。
  • 動的コントロールを作成または再作成します。
  • マスター ページを動的に設定します。
  • Theme プロパティを動的に設定します。
  • プロファイル プロパティ値の読み取りまたは設定。

初期化

すべてのコントロールが初期化され、スキン設定が適用された後に発生します。個々のコントロールの Init イベントは、ページの Init イベントの前に発生します。

このイベントを使用して、コントロール プロパティの読み取りまたは初期化を行います。

初期化完了

ページの初期化段階の最後に発生します。Init イベントと InitComplete イベントの間で行われる操作は 1 つだけです。つまり、ビュー ステートの変更の追跡がオンになっています。ビュー ステートの追跡により、コントロールは、プログラムによって ViewState コレクションに追加された値を永続化できます。ビュー ステートの追跡がオンになるまで、ビュー ステートに追加された値はポストバック間で失われます。コントロールは通常、Init イベントを発生させた直後にビュー ステートの追跡をオンにします。

このイベントを使用して、ビュー ステートを変更し、次のポストバック後も保持されるようにします。

プリロード

ページがそれ自体とすべてのコントロールのビュー ステートを読み込んだ後、Request インスタンスに含まれるポストバック データを処理した後に発生します。

于 2013-03-07T09:42:11.510 に答える
0

上記の記事とこれ、そして多くの検索のおかげで、ようやく問題が解決したようです。

public class MyGridView : GridView
{
    TextBox txtSearch;

    protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
    {
        int numRows = base.CreateChildControls(dataSource, dataBinding);

        // Create a new row
        GridViewRow rowSearch = base.CreateRow(-1, -1, DataControlRowType.DataRow, DataControlRowState.Normal);

        //convert the existing columns into an array, initialize and then add the row to the previously created table
        DataControlField[] fields = new DataControlField[this.Columns.Count];
        this.Columns.CopyTo(fields, 0);
        this.InitializeRow(rowSearch, fields);

        TableCell cellSearch = new TableCell();
        rowSearch.Cells.Add(cellSearch);

        txtSearch = new TextBox();
        txtSearch.Text = this.SearchTextboxDefaultValue;
        txtSearch.ID = "txtSearch";
        txtSearch.AutoPostBack = true;
        txtSearch.TextChanged += new EventHandler(txtSearch_TextChanged);
        cellSearch.Controls.Add(txtSearch);

        this.Controls[0].Controls.Add(rowSearch); // Controls[0] is a Table element

        return numRows;
    }

    protected void txtSearch_TextChanged(object sender, EventArgs e)
    {
        string search = (sender as TextBox).Text;
        DataTable dt = new DataTable();

        // We fill in dt with results, and rebind it

        this.DataSource = dt;
        this.DataBind();
    }
}

そして Page.cs で:

private DataTable dt;

protected void Page_Load(object sender, EventArgs e)
{
    sampleDataTable();
    if (!Page.IsPostBack)
    {
        myGrid.DataSource = dt;
        myGrid.DataBind();
    }
}

private void sampleDataTable()
{
    // Populate the dataTable
}

ありがとうございました

于 2013-03-08T15:21:23.743 に答える