2

Controlポストバックの原因となったダイナミクスを取得しようとしています。すべてControlsが に動的に追加されますPanel

<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
    <asp:Panel runat="server" ID="panel"></asp:Panel>
</asp:Content>

私は、次の 2 つの方法でポストバックを見つける必要があることを読みましたControl(この時点ではButtons、ポストバックを引き起こすことには関心がありませんが、気になるでしょう)。

private Control GetPostBackControl()
            {
            Control toReturn = null;
            string controlName = page.Request.Params.Get("__EVENTTARGET");
            if (!String.IsNullOrEmpty(controlName))
            {
                toReturn = RecurseControls(this.Page, controlName);
            }
           return toReturn;
    }

 private Control RecurseControls(Control root, String toFind)
        {
            String s = root.UniqueID;
            if (root.UniqueID == toFind)
            {
                return root;
            }
            foreach (Control c in root.Controls)
            {
                Control t = RecurseControls(c, toFind);
                if (t != null)
                {
                    return t;
                }
            }
            return null;
        }

デバッガーをステップ実行すると、再帰によってパネルが検出されますが、そのControls中に子はありません。これらのメソッドがどのように機能するかについての私の理解は最初はオフであり、Controlsこれのために再作成される前に動的に追加されたことを見つけることができないと想定していますPost。この場合、Controlポストバックをトリガーしたダイナミクスを見つける別の方法はありますか? そうでない場合、ページを 内に再投稿させる方法はありますControl's EventHandlerか?

マスターページを使用していることに注意してください。投稿したように再帰的な方法を使用するか、それともRecurseControls(this.Master, toFind);まだPanel'schildが表示されないかControlsGetPostBackControl()内でも呼ばれますPage_Init()

4

2 に答える 2

3

一般に、動的に追加されたコントロールは、サーバー ラウンド トリップごとに再追加する必要があります。例外は、ViewState を維持するコントロールのコントロール コンテンツです。ViewState が読み込まれる前に発生する PageInit 中にコントロールが追加されていることを確認してください。

次に、コントロールを参照して、その内容、値、選択したインデックスなどを取得するだけです。

于 2012-12-31T19:17:14.877 に答える
0

Request.Params動的に追加されたコントロールのいずれかに入力された値を見つける必要がある場合は、コレクションにアクセスするだけでいつでもそれらの値を見つけることができます。たとえば、「MyTextBox」という名前のTextBoxコントロールを動的に追加すると、コントロールがどのように追加されたかに関係なく、ページがポストバックすると、Request.Params["MyTextBox"]にユーザーが入力した値が含まれます。繰り返しますが、コントロールに名前を割り当てた場合。

簡単な例:

TextBox b= null;
for (int i = 0; i < 4; i++)
{
      b=new TextBox();
      b.ID="textbox"+i;
      //asp.net will assign the name the same as the ID of the element
      placeHolder.Controls.Add(b); //placeHolder is the container for all dynamically-added controls
}

ページがポストバックすると、たとえば、「textbox1」に入力された値を次のように取得できます。

if (IsPostBack)
{
    Response.Write(Request.Params["textbox1"]);
}

最後に、コントロールを見つけるために再帰的に繰り返すことは、信じられないほど非効率的です。ページにコントロールを追加すると、パフォーマンスが急激に低下します。注意して、ページを注意深く構成し、ページ全体を検索する代わりに、親コンテナのみを検索すると、ほとんどの場合、O(1)または少なくともO(n)でコントロールを見つけることができます。

于 2012-12-31T18:42:54.080 に答える