0

動的 ajax コントロールを作成すると、ポストバックでレンダリング前の問題が発生する場合があります。ポストバックでコントロールを再作成することになっていますが、コントロールが非常に多い場合、ポストバックごとにパフォーマンスが非常に遅くなります。つまり、コンボボックスをクリックすると、数秒かかる場合があります。そこで、コントロールをパネルにグループ化し、パネルをコレクションに保存してから、ポストバックでパネルを再呼び出ししました。パネル内のコントロールが標準の 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
4

1 に答える 1

1

ポストバックの遅さが ajax コントロール自体またはレクリエーションによるものかどうかを確認するテストを行いました。さて、実際の ajax コントロール自体を見つけに来てください。空白のページを作成し、40 個の ajax コンボボックスをオンにして (それぞれにいくつかの項目を追加)、postcack をオンにしました。ページを開始してアイテムをクリックすると、ポストバックが完了するまでに約 3 ~ 4 秒かかりました。

ドロップダウンリストで同じことをしたところ、うまく機能しました。残念ながら、コンボボックスのように使用することはできません。

于 2011-03-28T15:58:50.317 に答える