在回发时访问动态添加的控件

本文关键字:添加 控件 动态 访问 | 更新日期: 2023-09-27 17:50:28

我正在尝试获取导致回发的动态Control。所有的CCD_ 2被动态地添加到CCD_。

<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;
        }

当遍历调试器时,递归会找到面板,但其中没有子Controls。我假设我最初对这些方法的工作方式的理解是错误的,在为此Post重新创建它们之前,它们无法找到动态添加的Controls。如果是这种情况,是否有其他方法可以找到触发回发的动态Control?如果没有,是否有办法使页面在Control's EventHandler内重新发布?

请注意,我正在使用母版页。无论我是使用我发布的递归方法,还是像RecurseControls(this.Master, toFind);一样,我仍然看不到Panel's的子Controls。CCD_ 15也在CCD_。

在回发时访问动态添加的控件

通常,动态添加的控件需要在每次服务器往返时重新添加。例外情况是维护ViewState的控件的控件内容。确保在加载ViewState之前的PageInit期间添加控件。

然后,您可以简单地引用控件来获取它们的内容、值、所选索引等。

如果您只需要找到在任何动态添加的控件上输入的值,那么只需访问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(中找到控件。