我正在尝试获取导致回发的动态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;
}
当单步执行调试器时,递归会找到该面板,但其中没有子Controls
。我假设我对这些方法如何工作的理解最初是关闭的,并且在为此Controls
重新创建之前,他们无法找到动态添加的Post
。如果是这种情况,是否有另一种方法可以找到触发回发的动态Control
?如果没有,是否有办法让网页在Control's
EventHandler
内重新发布?
请注意我使用的是母版页。我是否按照发布的方式使用递归方法,或者像RecurseControls(this.Master, toFind);
那样使用递归方法,我仍然看不到Panel's
子Controls
。 GetPostBackControl()
内也会调用Page_Init()
。
答案 0 :(得分:3)
通常,需要在每次往返服务器上重新添加动态添加的控件。例外是维护ViewState的控件的控件内容。确保在加载ViewState之前发生的PageInit期间添加控件。
然后,您可以简单地引用您的控件来获取其内容,值,选定的索引等。
答案 1 :(得分: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)中的控件,而只搜索父容器。