I understand why this is happening, but I'm not sure the best way to handle it. The postback created when a RadDock is drag & dropped, closed, minimized, etc. is returning the HTML and overwriting the data bound RadGrids that are in the RadDocks within the RadDockZone that the RadDock is in. I don't want to requery the the web methods to repopulate the grids (kinda defeats the benefit of client-side data binding).
I have AutoPostBack enabled on the docks because I want to continuously persist the position/state of the docks. Is there anyway I can update the state of the docks via AJAX without doing a partial postback that overwrites my grid data (maybe by calling a WebMethod)? If so, how?
I've created a simple example page that demonstrates this issue (most controls are dynamically created because this is how the real application is).
Thanks!
*.aspx.vb
*.aspx
I have AutoPostBack enabled on the docks because I want to continuously persist the position/state of the docks. Is there anyway I can update the state of the docks via AJAX without doing a partial postback that overwrites my grid data (maybe by calling a WebMethod)? If so, how?
I've created a simple example page that demonstrates this issue (most controls are dynamically created because this is how the real application is).
Thanks!
*.aspx.vb
Imports Telerik.Web.UIImports System.Web.UI.WebControlsPartial Class DockClientDataBoundRadGrid Inherits System.Web.UI.Page Private _DockDataTable As System.Data.DataTable Protected Sub RadDockLayout1_LoadDockLayout(ByVal sender As Object, ByVal e As Telerik.Web.UI.DockLayoutEventArgs) Handles RadDockLayout1.LoadDockLayout Dim zones(1) As RadDockZone Dim zone As RadDockZone For i As Integer = 0 To zones.Length - 1 zone = New RadDockZone zone.Orientation = Orientation.Vertical zone.ID = "RadDockZone" & i zones(i) = zone Next RadDockLayout1.Controls.Add(CreateDockContainer(zones)) For Each zone In zones RadAjaxManager1.AjaxSettings.AddAjaxSetting(zone, zone) Next Dim docks(DockDataTable.Rows.Count - 1) As RadDock Dim dock As RadDock Dim rowCount As Integer = 0 For Each row As System.Data.DataRow In DockDataTable.Rows dock = New RadDock dock.AutoPostBack = True dock.DockMode = DockMode.Docked dock.UniqueName = "dock-" & rowCount dock.Title = row.Item("title") Dim _RadGrid As RadGrid = CreateRadGrid("RadGrid-" & rowCount) dock.ContentContainer.Controls.Add(_RadGrid) RadDockLayout1.Controls.Add(dock) docks(rowCount) = dock rowCount += 1 RadAjaxManager1.AjaxSettings.AddAjaxSetting(dock.ContentContainer, dock.ContentContainer) Next Dim lastZoneId As Integer = 0 For Each dock In docks If zones.Length <= lastZoneId Then lastZoneId = 0 zone = zones(lastZoneId) e.Indices(dock.UniqueName) = zone.Docks.Count e.Positions(dock.UniqueName) = zone.ID lastZoneId += 1 Next End Sub Private Function CreateRadGrid(ByVal ControlID As String) As RadGrid Dim _RadGrid As New RadGrid _RadGrid.ID = ControlID _RadGrid.ClientSettings.ClientEvents.OnCommand = "RadGrid1_DataBinding" _RadGrid.ClientSettings.DataBinding.Location = "~/DockClientDataBoundRadGrid.aspx" _RadGrid.ClientSettings.DataBinding.SelectMethod = "GetData" _RadGrid.ClientSettings.DataBinding.SelectCountMethod = "GetDataCount" _RadGrid.ClientSettings.DataBinding.StartRowIndexParameterName = "startRowIndex" _RadGrid.ClientSettings.DataBinding.MaximumRowsParameterName = "maxRows" _RadGrid.ClientSettings.DataBinding.EnableCaching = True _RadGrid.PageSize = 10 Dim c1 As New GridBoundColumn c1.HeaderText = "Name" c1.SortExpression = "Name" c1.DataField = "Name" c1.UniqueName = "Name" c1.DataType = System.Type.GetType("System.String") _RadGrid.MasterTableView.Columns.Add(c1) Return _RadGrid End Function Protected Function CreateDockContainer(ByRef zones As Telerik.Web.UI.RadDockZone()) As System.Web.UI.WebControls.WebControl Dim tbl As System.Web.UI.WebControls.Table = New System.Web.UI.WebControls.Table tbl.ID = "tblDockContainer" tbl.Style.Add("width", "100%") Dim row As System.Web.UI.WebControls.TableRow = New System.Web.UI.WebControls.TableRow Dim cell As System.Web.UI.WebControls.TableCell tbl.Rows.Add(row) Dim colSize As String = Math.Floor(100 / zones.Length).ToString() & "%" For Each zone As Telerik.Web.UI.RadDockZone In zones cell = New System.Web.UI.WebControls.TableCell cell.VerticalAlign = VerticalAlign.Top cell.Controls.Add(zone) cell.Style.Add("width", colSize) row.Cells.Add(cell) Next Return tbl End Function Protected ReadOnly Property DockDataTable() As System.Data.DataTable Get If _DockDataTable Is Nothing Then _DockDataTable = New System.Data.DataTable _DockDataTable.Columns.Add(New System.Data.DataColumn("title", System.Type.GetType("System.String"))) Dim row As System.Data.DataRow For i As Integer = 0 To 5 row = _DockDataTable.NewRow row("title") = "Dock Title " & i _DockDataTable.Rows.Add(row) Next _DockDataTable.AcceptChanges() End If Return _DockDataTable End Get End Property <System.Web.Services.WebMethod()> _ Public Shared Function GetData(ByVal startRowIndex As Integer, ByVal maxRows As Integer) As IEnumerable Dim list As New Generic.List(Of Entity) For i As Integer = startRowIndex To maxRows Dim e As New Entity e.Name = "Entity " & i list.Add(e) Next Return list End Function <System.Web.Services.WebMethod()> _ Public Shared Function GetDataCount() As Integer Return 51 End Function Public Class Entity Public Name As String End ClassEnd Class*.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="DockClientDataBoundRadGrid.aspx.vb" Inherits="DockClientDataBoundRadGrid" %><%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %><!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:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager><telerik:RadAjaxManager ID="RadAjaxManager1" runat="server"></telerik:RadAjaxManager><telerik:RadDockLayout ID="RadDockLayout1" runat="server"></telerik:RadDockLayout><telerik:RadScriptBlock ID="RadScriptBlock1" runat="server"> <script type="text/javascript"> function RadGrid1_DataBinding(sender, args) {} </script></telerik:RadScriptBlock></form></body></html>