2011-03-24 54 views
1

我正在处理页面加载特定控件的项目,具体取决于可用的索引。加载发生在调用方法PopulateSearchField的页面加载中。FindControl找不到我动态添加的UserControl

在这个方法中,所有的UserControl都被添加在页面上:Page.LoadControl(“path”);

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

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

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

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

非常感谢,大卫!

+0

UPDATE:至少在Page_Load或PreInit的末尾,取决于我在哪里使用PopulateSearchField方法,我可以到达Page.Controls集合,并且所有动态添加的控件都在那里。只有在Search_Button.click()这些控件不再存在。也许它可以帮助你。 – David 2011-03-25 11:54:05

回答

1

当您单击按钮时,当您的点击处理程序正在处理时,控件不再可用于服务器端。服务器端的页面不知道您动态创建的控件,因为没有用于映射到发布值的服务器端控件。如果你想查找值,你需要检查发布的控制数据,而不是依赖于服务器端的asp.net控件heirarchy。

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

以下是发生:

  1. 创建控件上点击动态
  2. 发布控制数据
  3. ASP.NET中的数据映射到它知道现行的管制措施。
  4. 您的控件未找到,因此数据未映射到任何内容。

您需要在映射发生之前添加您的控件(在PreInit中)。看看Page Lifecycle,你会看到它如何将所有的控件和数据联系在一起。

+0

非常感谢,我会尝试一下,我会尝试在preinit之前添加thoses控件,以确保控件已被映射。 – David 2011-03-25 11:47:02

+0

好像在PreInit中添加控件而不是Page_Load也无效。有可能是我没有抓到哈哈。我会在页面生命周期中查找所有内容。 – David 2011-03-25 11:48:37

+0

我只是做了一些调试,它告诉我两件事。在OnPreInit()的结尾处,我的Page.Controls集合有8个元素,这意味着动态搜索字段已被正确添加。但是如果我在Page_Load中放置断点,那么Page.Controls现在只有3个元素。这很奇怪,在同一个循环中,我的控制消失了。 – David 2011-03-25 11:58:18

0

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

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

此外,由于您似乎希望将值从控件中取出,因此您必须确保每次都使用完全相同的ID属性创建控件,并在之前创建了10视图状态,如果你想让他们保留自己的价值。

+0

控件具有相同的ID,这不是问题。如果我至少可以在Page.Controls ControlCollection中看到这些控件,那么我很容易获取这些值,但控件甚至不是集合的一部分。 – David 2011-03-25 11:50:15

+0

非常感谢Whomp :),现在我的问题是ID问题嘿嘿。现在你使用的是非常有用的! – David 2011-03-25 12:10:38

相关问题