Пример динамического управления. Элементы управления скриптом не могут быть зарегистрированы после PreRender
При создании динамических элементов управления 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 ответ
Я только что проверил, была ли медлительность обратной передачи от самих элементов управления ajax или отдыха. Ну, приезжайте, чтобы выяснить, что это за фактические элементы управления ajax. Я создал пустую страницу, поместил 40 комбинированных списков ajax (добавив пару элементов к каждому), включил postcack. Когда я запустил страницу и щелкнул элемент, для завершения обратной передачи потребовалось около 3 или 4 секунд.
Сделал то же самое с выпадающим списком, и он прекрасно работает. Жаль, что вы не можете использовать его как комбинированный ящик.