2

作品:

protected void Page_Load(object sender, EventArgs e)
{
    myButton.Click += new EventHandler(myButton_Click);
}

動作しません:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        myButton.Click += new EventHandler(myButton_Click);
    }
}

さて、2番目の例で私が期待したのは、イベントハンドラーがポストバックではない場合(つまり、ページが最初に読み込まれたとき)にのみボタンに接続され、その後、ポストバックではボタンが実行されなくなることでした。イベントに関連付けられたメソッド。そうではないようです---最初のロード(ポストバックではない)から、ボタンをクリックしても何も起こりません。

私の疑惑は、これがページのライフサイクルに関連しているということです---しかし、これがどこに該当するのかはよくわかりません。私が正しく理解していれば、イベントに関連付けられたメソッドは、ページがポストバックされた後に実行されます(ページが最初に読み込まれたときにクリックした場合でも)が、イベントをメソッドに接続することを指します。関連するメソッドの実際の実行ではなく、EventHandlerデリゲート。

注:これは純粋に舞台裏で何が起こっているのかをよりよく理解するための試みであり、現実世界の問題を解決するための試みではありません。

4

4 に答える 4

1

各ページリクエストでコードがどのように実行されるかを考える必要があります。サーバーで何が起こるかというと、リクエストごとにクラスインスタンスが作成され、コード行が

myButton.Click + = new EventHandler(myButton_Click);

条件付きであるということは、イベントハンドラーがポストバック時にイベントに接続されていないことを意味します。

言い換えれば、あなたが次のようなものを書くなら

<asp:Button ID="myButton" runat="server" OnClick="myButton_Click"  />

これはあなたが書いたコードに変換され、イベントは各リクエストに関連付けられます。

于 2012-08-07T03:17:29.767 に答える
0

ポストバックでない場合は、ユーザーがブラウザにURLを入力して(またはリンクをクリックして...)ページをリクエストした(HTTP Getリクエスト)ことを意味します。

ユーザーがボタンをクリックすると、ブラウザーはHTTP Post要求を行います。サーバー側では、ASP.NETは、要求されたページに、ページオブジェクトのプロパティIsPostBackをtrueに設定してマークを付けます。

この質問の答えを参照してください。

于 2012-08-07T03:13:58.893 に答える
0

問題は、イベントハンドラーがトリガーできるのはポストバックの場合のみであるということです。イベントハンドラーの配線は、クラスのこのインスタンスにのみ影響します。ポストバックが発生すると、ページの新しいインスタンスが作成され、イベントハンドラーは配線されなくなります。トリガーされるようにするには、配線する必要があります。

最善の方法は、常にイベントハンドラーを配線することです。そうしない理由はありません。

于 2012-08-07T03:15:51.280 に答える
0

あなたがやろうとしているのは、ポストバックのボタンを無効にすることだと思います。これを行うには、enabledプロパティをfalseに設定します。

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        myButton.Enabled = false;
    }
}
于 2012-09-06T16:18:32.163 に答える