2

我正在尝试获取Control导致回发的动态。所有Controls都被动态添加到Panel.

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

我已经读过以下两种方法应该找到回发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;
        }

单步执行调试器时,递归会找到面板,但其中没有子面板ControlsControls我假设我对这些方法如何工作的理解最初是关闭的,并且在为此重新创建它们之前找不到动态添加的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 回答