1

いくつかのボタンを持つユーザー コントロールがあるとします。この方法を使用して、ポストバックの原因を知りたいです。

public static Control GetPostBackControl(Page page)
    {
        Control control = null;

        string ctrlname = page.Request.Params.Get("__EVENTTARGET");
        if (ctrlname != null && ctrlname != string.Empty)
        {
            control = page.FindControl(ctrlname);
        }
        else
        {
            foreach (string ctl in page.Request.Form)
            {
                Control c = page.FindControl(ctl);
                if (c is System.Web.UI.WebControls.Button)
                {
                    control = c;
                    break;
                }
            }
        }
        return control;
    }

そして、これが私がそれを呼んでいる方法です:

string btn = GetPostBackControl(this.Page).ID;

オブジェクト参照がオブジェクトのインスタンスに設定されていません。」というメッセージが表示されます。問題は、親ページを表すthis.Pageを使用していることが原因であることがわかりました。

私がいるユーザーコントロールを参照する方法は? (親ページではありません)ポストバックの原因となったボタンを見つけるメソッドと連携できるようにするには?

助けてくれてありがとう。

編集

どちらのボタンもユーザー コントロール内にあります。GetPostBackControl()も、ユーザー コントロールのコード ビハインドにあります。

4

1 に答える 1

2

与えられたコードで簡単な例を実行しましたが、うまくいきました。おそらくあなたはチェックを逃しました Page.IsPostBackか?明らかに、postBack がある場合、postBackControl のみが存在します...

@Buttons - としてレンダリングされる<input type="submit">ため、 内には表示されません___EVENTTARGETライアン・ファーレイが彼のブログに書いたのはそのためです

ただし、別の方法でアクセスできます。ボタン (または入力) はフォームを送信するためのものであるため、送信されたフォームからの他のすべての値と共に、フォーム コレクション内の項目に追加されます。[...] Form コレクションでボタンを検索すると、それがポストバックの原因になります (ページを送信する原因となったのはボタンであると仮定します)。最初に __EVENTTARGET をチェックすると、それ が空の場合は Form コレクションのボタンを探して、ポストバックの原因を見つけます

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {
        Control postBackControl = GetPostBackControl(this.Page);
        Debug.WriteLine("PostBackControl is: " + postBackControl.ID);
    }
}
public static Control GetPostBackControl(Page page)
{
    Control control = null;

    string ctrlname = page.Request.Params.Get("__EVENTTARGET");
    if (ctrlname != null && ctrlname != string.Empty)
    {
        control = page.FindControl(ctrlname);
    }
    else
    {
        foreach (string ctl in page.Request.Form)
        {
            Control c = page.FindControl(ctl);
            if (c is System.Web.UI.WebControls.Button)
            {
                control = c;
                break;
            }
        }
    }
    return control;
}
于 2013-02-14T19:30:59.610 に答える