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

时间:2012-12-31 18:26:20

标签: c# asp.net

我正在尝试获取导致回发的动态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'sControlsGetPostBackControl()内也会调用Page_Init()

2 个答案:

答案 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)中的控件,而只搜索父容器。