Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在回发时访问动态添加的控件_C#_Asp.net - Fatal编程技术网

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

C# 在回发时访问动态添加的控件,c#,asp.net,C#,Asp.net,我正在尝试获取导致回发的动态控件。所有控件都动态添加到面板 <asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent"> <asp:Panel runat="server" ID="panel"></asp:Panel> </asp:Content> 单步执行调试器时,递归会找到面板,但其中没有子控件。我假设我对这些方法如何工作的理解最初是

我正在尝试获取导致回发的动态
控件。所有
控件
都动态添加到
面板

<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
    <asp:Panel runat="server" ID="panel"></asp:Panel>
</asp:Content>
单步执行调试器时,递归会找到面板,但其中没有子
控件。我假设我对这些方法如何工作的理解最初是错误的,并且在为此
Post
重新创建控件之前,它们无法找到动态添加的
控件。如果是这种情况,是否有其他方法可以找到触发回发的动态
控件
?如果没有,是否有办法使页面在
控件的
事件处理程序中重新发布


请注意,我使用的是母版页。无论我是使用我发布的递归方法,还是类似于
recurseControl(this.Master,toFind)我仍然看不到
面板的子
控件
GetPostBackControl()
也在
Page_Init()

中调用。如果您只需要查找在动态添加的任何控件上输入的值,您总是可以通过访问
请求.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
}

最后,递归迭代以查找控件的效率非常低。当更多控件添加到页面时,性能会呈指数级下降。如果您仔细构建页面,而不是搜索整个页面,只搜索父容器,则几乎总是可以在O(1)或至少O(n)中找到控件。

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


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

我发现动态创建的控件非常混乱,尤其是如果您回发页面。考虑不要这样做,并使用完全静态控件(如代码>数据DATAGRID和<代码>中继器< /代码>可以用来表示未知量的数据)。从个人经验来看,这样做比尝试处理要容易得多。每次请求(包括回发)都需要重新创建动态创建控件的可能副本。ASP.NET不会自动为您执行此操作。我希望所有内容都已预定义,只需处理Visible属性或使用DataGrid即可。但是,究竟是什么用户控件以什么顺序被添加/删除,或者有多少用户控件是未知的——这都是基于用户输入的。此外,用户控件将在页面_Init中重新创建,但需要根据导致回发的控件添加/删除新的用户控件。这就是为什么我在娱乐之前尝试使用这两种方法。也许我可以使用类似于中继器的东西来达到同样的效果,但我不熟悉这种控制。我要读一读。谢谢你的建议。这是我不知道的很好的信息,我绝对可以用它来做这个项目。不幸的是,我只需要对大部分正在进行的操作进行回发的控件。谢谢你的建议!
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
}
if (IsPostBack)
{
    Response.Write(Request.Params["textbox1"]);
}