Пример динамического управления. Элементы управления скриптом не могут быть зарегистрированы после 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 секунд.

Сделал то же самое с выпадающим списком, и он прекрасно работает. Жаль, что вы не можете использовать его как комбинированный ящик.

Другие вопросы по тегам