动态控件示例。 PreRender之后可能无法注册脚本控件

时间:2011-03-25 16:51:11

标签: asp.net ajax dynamic-controls

创建动态ajax控件时,您可能会在回发时遇到预渲染问题。您应该在回发时重新创建控件,但是如果其中有很多,则每次回发之间的性能变得非常慢。即点击组合框,可能需要几秒钟。所以我所做的是将控件分组在面板中,将面板存储在一个集合中,然后在Postback上重新调用面板。如果面板内的控件是标准的html控件(文本框,下拉列表等),这实际上很有用。但是......对于ajax控件来说效果不佳......

我在下面提供了一个示例。取消注释/注释代码以测试它。如果有人知道如何使用ajax控件来完成这项工作会很棒。

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="PreRenderAjax.WebForm1" %> 

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0     Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
  <title></title> 
  </head> 
<body> 
  <form id="form1" runat="server"> 
  <asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"> 
  </asp:ToolkitScriptManager> 
  <div> 
    <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder> 
  </div> 
  </form> 
</body> 
</html>


Public Class WebForm1 
Inherits System.Web.UI.Page 

Shared panellist As New List(Of Panel) 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles   Me.Load 
    If IsPostBack Then 
        'This is for reloading panels. Works with dropdownlist, but not ajax combobox 
        For Each pn As Panel In panellist 
            PlaceHolder1.Controls.Add(pn) 
        Next 

        'This for re-creating all the controls again. Not very efficient for ajax controls though. 
        'CreateInterface() 
    Else 
        CreateInterface() 
    End If 
End Sub 

Protected Overrides Sub CreateChildControls() 
    MyBase.CreateChildControls() 
End Sub 

Protected Overrides Sub OnInit(ByVal e As System.EventArgs) 
    MyBase.OnInit(e) 
    EnsureChildControls() 
End Sub 

Private Sub CreateInterface() 
    Dim pn As Panel 

    pn = CreatePanel("panel1") 
    CreateControls(pn, 5) 
    pn = CreatePanel("panel2") 
    CreateControls(pn, 5) 
    pn = CreatePanel("panel3") 
    CreateControls(pn, 5) 
    pn = CreatePanel("panel4") 
    CreateControls(pn, 5) 

End Sub 

Private Function CreatePanel(ByVal name As String) As Panel 
    Dim pn As New Panel 
    pn.ID = name 
    pn.Width = 250 
    pn.BorderStyle = BorderStyle.Solid 
    pn.BorderColor = Drawing.Color.Blue 
    pn.Style.Add("margin", "5px") 
    pn.Style.Add("padding", "5px") 
    PlaceHolder1.Controls.Add(pn) 
    panellist.Add(pn) 
    CreatePanel = pn 
End Function 

Private Sub CreateControls(ByVal pn As Panel, ByVal howmany As Integer) 
    Dim cbo As AjaxControlToolkit.ComboBox 
    'Dim cbo As DropDownList 
    For i As Integer = 0 To howmany - 1 
        cbo = New AjaxControlToolkit.ComboBox 
        'cbo = New DropDownList 
        cbo.ID = pn.ID & "_cbo" & i 
        cbo.Width = 200 
        cbo.Items.Add("Item 1") 
        cbo.Items.Add("Item 2") 
        cbo.Items.Add("Item 3") 
        cbo.Items.Add("Item 4") 
        cbo.Items.Add("Item 5") 
        cbo.Style.Add("margin", "3px") 
        cbo.AutoPostBack = True 
        pn.Controls.Add(cbo) 
    Next 
  End Sub 

End Class

1 个答案:

答案 0 :(得分:1)

我只是做了一个测试,看看回传的缓慢是来自ajax控件本身还是娱乐。那么来找出它真正的ajax控制自己。我创建了一个空白页面,打开40个ajax组合框(每个都添加几个项目),打开后加工。当我启动页面并单击某个项目时,需要大约3或4秒才能完成回发。

使用下拉列表做同样的事情并且效果很好。太糟糕了,你不能像组合框一样使用它。