FindControl将找不到我动态添加的UserControl

时间:2011-03-24 21:19:47

标签: asp.net dynamic-usercontrols

我正在开发一个项目,其中页面根据可用的索引加载某些控件。加载发生在调用方法PopulateSearchField的页面加载中。

在此方法中,所有UserControl都使用以下命令添加到页面上:Page.LoadControl(“path”);

页面加载和所有必需的控件都在页面上。我的问题是当用户点击搜索按钮时触发事件并根据这些控件中的用户输入构建查询。不幸的是,该方法无法生成正确的查询,因为它无法在页面上找到任何控件。

使用临时的ControlCollection变量,我已经能够看到我的页面上的控件数量是3,它应该是4到10之间的东西。集合中的3个控件是静态标签和按钮上的页。

我不知道代码是否有问题,或者它是否是页面循环问题,因为此解决方案曾用于框架1.1。是的,我知道这不是最好的事情,但他们是这样做的,我必须让它发挥作用。

我不确定是否是导致问题的迁移。

非常感谢,大卫!

2 个答案:

答案 0 :(得分:1)

单击该按钮时,在处理单击处理程序时,控件不再可用于服务器端。页面(服务器端)不知道您动态创建的控件,因为没有服务器端控件可以映射到的已发布值。如果要查找值,则需要检查发布的控制数据,而不是依赖服务器端的asp.net控件层次结构。

您还可以通过javascript将所需的所有数据写入隐藏字段,然后读取隐藏数据服务器端,因为它将被发布。

发生以下情况:

  1. 动态创建控件
  2. 点击
  3. 发布控件数据
  4. ASP.NET将数据映射到它知道的现有控件。
  5. 找不到您的控件,因此数据未映射到任何内容。
  6. 您需要在映射发生之前添加控件(在PreInit中)。查看Page Lifecycle,您将看到它如何将所有控件和数据联系在一起。

答案 1 :(得分:0)

当用户点击搜索时,您是否正在将控件重新添加到新页面?

请记住...每次用户点击该页面的服务器时......都会创建一个新的Page对象。如果您正在动态添加控件,则必须在每次加载页面时执行此操作。

此外,由于您似乎想要从控件中获取值,因此您必须确保每次都使用完全相同的ID属性创建控件,并在 > viewstate已加载,如果您希望它们保留其值。