在回发时访问动态添加的控件
本文关键字:添加 控件 动态 访问 | 更新日期: 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(中找到控件。