【问题标题】:If I cannot use OnPreInit in Controls, how can I add my controls dynamically on the right time?如果我不能在控件中使用 OnPreInit,如何在正确的时间动态添加我的控件?
【发布时间】:2009-12-23 09:13:33
【问题描述】:

我想要一个用户控件,它会在 asp.NET 面板中动态添加一些复选框。

我只是相信我可以在控件的 OnPreInit 方法中轻松做到这一点。但问题是我了解到我不能在控件上使用和覆盖 OnPreInit 方法;它仅用于页面。

我不想通过调用控件上的方法从页面解决这个问题。

那么,如果我不能在控件上使用 PreInit,那么在哪里可以动态添加我的复选框?

我错过了什么吗?有什么建议吗?

谢谢。

【问题讨论】:

    标签: asp.net user-controls dynamic onpreinit preinit


    【解决方案1】:

    我认为很大程度上取决于你想用它们做什么 - 你应该知道动态添加的控件会获得它们自己的生命周期(谷歌搜索应该会为你提供大量信息,但基本上它们会“赶上”在他们错过的任何阶段)。我只提到这一点是因为您可能想了解一些陷阱 - 当我第一次经历它时,我花了几天时间来解决它。

    要回答您的问题,我建议最好的地方是在控件的 OnInit 阶段添加复选框。为了您的信息,我在标准页面加载期间使用在页面上声明的正常自定义控件时发生事件的标准顺序提供了以下信息。

    Page: Constructor
    
    Page: OnPreInit
    
    ---- Declared Controls Constructed ----
    
    Control: OnInit
    
    Page: OnInit
    
    Page: OnInitComplete
    
    Page: LoadViewState
    
    Control: LoadViewState
    
    Page: OnPreLoad
    
    Page: OnLoad
    
    Control: OnLoad
    
    ---- Any Control Events (e.g. btnClick) ----
    
    Page: OnLoadComplete
    
    Page: OnPreRender
    
    Control: OnPreRender
    
    Page: OnPreRenderComplete
    
    Page: SaveViewState
    
    Control: SaveViewState
    
    Page: OnSaveStateComplete
    
    Page: Render
    
    Page: RenderChildren  -> Control: Render
    
    Control: OnUnload
    
    Page: OnUnload
    

    【讨论】:

    • 很棒的清单,今天刚刚帮了我! +1
    【解决方案2】:

    您也可以在 Page_Load 事件中执行此操作。这有什么问题?

    【讨论】:

    • 控件的 ViewState 在 Init 事件中加载。如果我在 Load 事件中添加控件,则在 Init 事件中,将尝试在控件不存在时加载 ViewState。所以它不能以这种方式工作。
    • 对于动态控件,视图状态将在每个回发中存在,但控件将不存在,因此您必须在 Page_Load 中的每个回发中创建这些控件。
    【解决方案3】:

    如果您尝试使用复选框的值,请尝试使用

     Page.Form.FindControl("ID")
    

    【讨论】:

    • 这不是找到它们,而是在正确的地方创建它们。
    【解决方案4】:

    一般的经验法则是尽快创建自定义控件。在 PreRender 之前,控件的所有事件都会正常发生。如果您在 PreRender 添加自定义控件,它们不会加载视图状态或调用事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-31
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多