3

ここで奇妙な状況が発生しました... System.Web.UI.WebControls.WebParts.EditorPart クラスがあります。「検索」ボタンをレンダリングし、このボタンをクリックすると、clickHandler メソッドが DB 検索を実行し、返される行ごとに LinkBut​​ton を動的に作成し、CommandName および CommandArgument プロパティを設定し、CommandEventHandler メソッドを追加してから、LinkBut​​ton コントロールを追加します。ページに。

問題は、LinkBut​​ton をクリックすると、その CommandEventHandler メソッドが呼び出されず、元の「検索」ボタンが押される前の場所にページがポストされたように見えることです。

OnLoad() またはその他の初期のメソッドにイベント ハンドラーを追加する必要があるという投稿を見たことがありますが、ユーザーが何を検索するかを指定して [検索] ボタンを押すまで、私の LinkBut​​tons は作成されません.. .これに対処する方法についてのアイデアはありますか?

ありがとう!

4

4 に答える 4

3

これは私のお気に入りのトリックです:)

私たちのシナリオは、最初にコントロールをレンダリングすることです。次に、ユーザーからの入力を使用して、さらにコントロールをレンダリングし、イベントに応答させます。

ここで重要なのは状態です。コントロールが PostBack に到着したときの状態を知る必要があるため、ViewState を使用します。この問題は、ニワトリが先か卵が先かという問題になります。ViewState は呼び出し後まで使用できませんLoadViewState()が、イベントを正しく発生させるには、その呼び出しの前にコントロールを作成する必要があります。

秘訣はオーバーライドすることです。これによりLoadViewState()SaveViewState()物事を制御できます。

(以下のコードは大雑把で、メモリからのものであり、おそらく問題があることに注意してください)

private string searchQuery = null;

private void SearchButton(object sender, EventArgs e)
{
    searchQuery = searchBox.Text;
    var results = DataLayer.PerformSearch(searchQuery);
    CreateLinkButtonControls(results);
}

// We save both the base state object, plus our query string.  Everything here must be serializable.
protected override object SaveViewState()
{
    object baseState = base.SaveViewState();
    return new object[] { baseState, searchQuery };
}

// The parameter to this method is the exact object we returned from SaveViewState().
protected override void LoadViewState(object savedState)
{
    object[] stateArray = (object[])savedState;

    searchQuery = stateArray[1] as string;

    // Re-run the query
    var results = DataLayer.PerformSearch(searchQuery);

    // Re-create the exact same control tree as at the point of SaveViewState above.  It must be the same otherwise things will break.
    CreateLinkButtonControls(results);

    // Very important - load the rest of the ViewState, including our controls above.
    base.LoadViewState(stateArray[0]);
}
于 2008-10-14T14:10:05.363 に答える
1

動的に作成されたコントロールをオンロードに再追加して、それらがページ階層にあり、イベントを発生できるようにする必要があります。

于 2008-09-26T18:42:26.163 に答える
-1

私が思いついた汚いハックは、実際のボタンと同じ ID を持つダミーの LinkBut​​ton を作成することです。したがって、Pre_Render で LinkBut​​ton "foo" を作成し (これでは遅すぎます)、Page_Load でダミーの foo も作成するとします。

        var link = new LinkButton();
        link.ID = "foo";
        link.Click += fooEventHandler;
        dummyButtons.Controls.Add(link);

(ここで、「dummyButtons」は、Visibility が false に設定されたページ上の単なる PlaceHolder です。) 見苦しいですが、機能します。

于 2010-04-01T09:26:39.753 に答える