创建动态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
答案 0 :(得分:1)
我只是做了一个测试,看看回传的缓慢是来自ajax控件本身还是娱乐。那么来找出它真正的ajax控制自己。我创建了一个空白页面,打开40个ajax组合框(每个都添加几个项目),打开后加工。当我启动页面并单击某个项目时,需要大约3或4秒才能完成回发。
使用下拉列表做同样的事情并且效果很好。太糟糕了,你不能像组合框一样使用它。