使用检索到的数据创建动态控件[Asp - Vb .Net]

时间:2014-05-25 04:58:49

标签: asp.net vb.net webforms dynamically-generated

我试图通过使用查询中的检索数据来创建多个控件,但是阻止它们在回发时消失,允许我获取并保留它们的值,我遇到的问题是我无法在Init上创建它们因为只有在用户选择菜单上的项目后,才能知道控件的数量,ID和其他属性。

  1. Page加载一个菜单及其所有项目和值(取决于数据),此外,还会加载一个按钮
  2. 用户点击菜单上的项目。
  3. 选择的值用于通过使用数据集执行查询(这发生在从Menu_ItemClick事件调用的函数内部。)
  4. 从查询中检索的数据用于确定必须创建多少个控件(2,4,6等)。每个控件都有唯一的ID,根据数据给出。
  5. 创建控件并将其放入面板(名为 p )。
  6. 现在控件可见并可供编辑(RadioButtons,TextAreas)
  7. 用户点击按钮将动态控件中的信息保存到数据库
  8. 我面临的问题

    1. 单击按钮时控制回发时的消息,因为它们不是在Init上创建的。
    2. 在UpdatePanel上放置按钮以防止整页回发,在尝试此操作时无法访问动态控件:
    3. For Each c In p.Controls
      ...
      Next
      

      它获得的唯一控件是单个Literal控件(控件计数 1 ),就好像其他控件不存在一样。

      提前谢谢。

1 个答案:

答案 0 :(得分:0)

当你在点击按钮时写回"控制消息时,因为它们没有在Init"上创建,你的意思是说"当点击按钮时,控制在回发时消失,因为他们不是 重新 - 在Init"?如果没有,那么这可能是您的问题的根本原因 - 必须始终重新创建动态创建的控件以响应PostBack(参见ASP.NET dynamically created controls and Postback)。可能还存在其他问题,因为随着您的场景越来越复杂,Web窗体中的动态控件可能会带来很多挑战 - 这里有一篇文章在各种场景下列出了许多场景http://www.singingeels.com/Articles/Dynamically_Created_Controls_in_ASPNET.aspx(例如,如果用户可以从DropDownList重新选择以生成一组不同的动态控件。所有这些的规范性参考是http://msdn.microsoft.com/en-us/library/ms178472.aspx

现在,在PostBack上,您需要一些方法来确定哪些控件是动态创建的,以便可以动态地重新创建它们。因此,您需要存储允许您动态创建控件的任何信息。由于ViewState在Page_Init中不可用,并且在使用会话时可能会引入其他问题,我的建议是简单地声明包含该状态信息的HiddenField。在Page_Init中,您需要从Request.Form获取HiddenField的值(因为您的HiddenField的值不会被加载到ViewState的Page_Init之后)并从那里返回到创建你的控件。

我的最终建议:首先尝试使用常规Panel处理所有内容,然后尝试引入UpdatePanel - 首先不需要使问题过于复杂。