4 Answers, 1 is accepted

http://www.telerik.com/community/forums/thread/b311D-bkdgdg.aspx
"I prepared a sample project which demonstrates how you could modify the Dynamically Created Docks example so that it saves the state into Database. Please, take a look at the attached archive and let us know in case you still experience any problems.
Best regards,
Sophy "
Hope this helps!

Use the RadDockLayout1_SaveDockLayout and Create a connection to your database and store it there.
as
Protected Sub RadDockLayout1_SaveDockLayout(ByVal sender As Object, ByVal e As DockLayoutEventArgs)
' Create a connection
' Save or Update Session("UserPreferences.PortalConfiguration").ToString In Database field if you using this session variable.
End Sub
And fill the Session() variable again on next load from database.
Cheers
Rick

The below code works for me when i create the radDockzones in aspx page itself.But In my project ,I created the dockzones dynamically.then d below code wont work.
In page1.aspx
<
form id="Form1" method="post" runat="server">
<asp:scriptmanager id="ScriptManager" runat="server" />
<asp:button runat="server" CssClass="button" id="ButtonAddDock" text="Add Dock" onclick="ButtonAddDock_Click" />
<asp:button runat="server" id="ButtonPostback" CssClass="button" text="Make Postback" />
<br/><br/>
<telerik:raddocklayout runat="server" id="RadDockLayout1"
onsavedocklayout="RadDockLayout1_SaveDockLayout"
onloaddocklayout="RadDockLayout1_LoadDockLayout">
<%
--<telerik:raddockzone runat="server" id="RadDockZone1" Width="300" MinHeight="200" Style="float:left;margin-right:20px;">
</telerik:raddockzone>--
%>
<telerik:raddockzone Width="300" MinHeight="200" runat="server" id="RadDockZone2" Style="float:left;">
</telerik:raddockzone>
<div style="display:none">
Hidden UpdatePanel, which is used to receive the new dock controls.
We will move them with script to the desired initial dock zone.
<asp:updatepanel runat="server" id="UpdatePanel1">
<triggers>
<asp:asyncpostbacktrigger controlid="ButtonAddDock" eventname="Click" />
</triggers>
</asp:updatepanel>
</div>
</telerik:raddocklayout>
</form>
In Page1.aspx.cs
using
System;
using
System.Collections;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Web;
using
System.Web.SessionState;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.HtmlControls;
using
Telerik.Web.UI;
using
System.Data.SqlClient;
using
System.Configuration;
using
System.Text;
namespace
Telerik.Web.Examples.Dock.DynamicDocks
{
public partial class DefaultCS : System.Web.UI.Page
{
private SqlConnection _conn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
// myConnection2 = New SqlConnection(ConfigurationManager.AppSettings("ConnectionString"))
private int _count = 0;
private RadDock CreateRadDockFromState(string stringState)
{
System.Web.Script.Serialization.
JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
DockState state = serializer.Deserialize<DockState>(stringState);
RadDock dock = new RadDock();
dock.ID =
string.Format("RadDock{0}", state.UniqueName);
dock.ApplyState(state);
dock.Command +=
new DockCommandEventHandler(dock_Command);
dock.Commands.Add(
new DockCloseCommand());
dock.Commands.Add(
new DockExpandCollapseCommand());
return dock;
}
private RadDock CreateRadDock()
{
RadDock dock = new RadDock();
dock.UniqueName =
Guid.NewGuid().ToString();
dock.ID =
string.Format("RadDock{0}", dock.UniqueName);
dock.Title =
"Dock";
dock.Text =
string.Format("Added at {0}", DateTime.Now);
dock.Width =
Unit.Pixel(300);
dock.Commands.Add(
new DockCloseCommand());
dock.Commands.Add(
new DockExpandCollapseCommand());
dock.Command +=
new DockCommandEventHandler(dock_Command);
return dock;
}
void dock_Command(object sender, DockCommandEventArgs e)
{
if (e.Command.Name == "Close")
{
ScriptManager.RegisterStartupScript(
UpdatePanel1,
this.GetType(),
"RemoveDock",
string.Format(@"function _removeDock() {{ Sys.Application.remove_load(_removeDock);$find('{0}').undock(); $get('{1}').appendChild($get('{0}')); $find('{0}').doPostBack('DockPositionChanged');}};Sys.Application.add_load(_removeDock);", ((RadDock)sender).ClientID, UpdatePanel1.ClientID),
true);
}
}
private void CreateSaveStateTrigger(RadDock dock)
{
//Ensure that the RadDock control will initiate postback
// when its position changes on the client or any of the commands is clicked.
//Using the trigger we will "ajaxify" that postback.
dock.AutoPostBack =
true;
dock.CommandsAutoPostBack =
true;
AsyncPostBackTrigger saveStateTrigger = new AsyncPostBackTrigger();
saveStateTrigger.ControlID = dock.ID;
saveStateTrigger.EventName =
"DockPositionChanged";
UpdatePanel1.Triggers.Add(saveStateTrigger);
saveStateTrigger =
new AsyncPostBackTrigger();
saveStateTrigger.ControlID = dock.ID;
saveStateTrigger.EventName =
"Command";
UpdatePanel1.Triggers.Add(saveStateTrigger);
}
protected void Page_Init(object sender, EventArgs e)
{
string dockState = "";
try
{
_conn.Open();
SqlCommand command = new SqlCommand("select State from dockState where id=1", _conn);
dockState = command.ExecuteScalar().ToString();
_conn.Close();
}
catch
{
}
string[] currentDockStates = dockState.Split('|');
_count = currentDockStates.Length;
//Recreate the docks in order to ensure their proper operation
for (int i = 0; i < _count; i++)
{
if (currentDockStates[i].Trim() != string.Empty)
{
RadDock dock = CreateRadDockFromState(currentDockStates[i]);
//We will just add the RadDock control to the RadDockLayout.
// You could use any other control for that purpose, just ensure
// that it is inside the RadDockLayout control.
// The RadDockLayout control will automatically move the RadDock
// controls to their corresponding zone in the LoadDockLayout
// event (see below).
RadDockLayout1.Controls.Add(dock);
//We want to save the dock state every time a dock is moved.
CreateSaveStateTrigger(dock);
}
}
}
protected void RadDockLayout1_SaveDockLayout(object sender, Telerik.Web.UI.DockLayoutEventArgs e)
{
string dockState;
System.Web.Script.Serialization.
JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
List<DockState> stateList = RadDockLayout1.GetRegisteredDocksState();
StringBuilder serializedList = new StringBuilder();
int i = 0;
while (i < stateList.Count)
{
serializedList.Append(serializer.Serialize(stateList[i]));
serializedList.Append(
"|");
i++;
}
dockState = serializedList.ToString();
if (dockState.Trim() != String.Empty)
{
try
{
_conn.Open();
SqlCommand command = new SqlCommand(String.Format("update DockState set State='{0}' where id=3", dockState), _conn);
command.ExecuteNonQuery();
_conn.Close();
}
catch
{
}
}
//Save the dockState string into DB
}
protected void RadDockLayout1_LoadDockLayout(object sender, Telerik.Web.UI.DockLayoutEventArgs e)
{
System.Web.Script.Serialization.
JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
//Get saved state string from the database - set it to dockState variable for example
string dockState = "";
try
{
_conn.Open();
SqlCommand command = new SqlCommand("select State from DockState where id=3", _conn);
dockState = command.ExecuteScalar().ToString();
_conn.Close();
}
catch
{
}
string[] currentDockStates = dockState.Split('|');
foreach (string stringState in currentDockStates)
{
if (stringState.Trim() != string.Empty)
{
DockState state = serializer.Deserialize<DockState>(stringState);
e.Positions[state.UniqueName] = state.DockZoneID;
e.Indices[state.UniqueName] = state.Index;
}
}
}
protected void ButtonAddDock_Click(object sender, EventArgs e)
{
RadDock dock = CreateRadDock();
//In order to optimize the execution speed we are adding the dock to a
// hidden update panel and then register a script which will move it
// to RadDockZone1 after the AJAX request completes. If you want to
// dock the control in other zone, modify the script according your needs.
UpdatePanel1.ContentTemplateContainer.Controls.Add(dock);
ScriptManager.RegisterStartupScript(
dock,
this.GetType(),
"AddDock",
string.Format(@"function _addDock() {{
Sys.Application.remove_load(_addDock);
$find('{1}').dock($find('{0}'));
$find('{0}').doPostBack('DockPositionChanged');
}};
Sys.Application.add_load(_addDock);"
, dock.ClientID, RadDockZone1.ClientID),
true);
//Right now the RadDock control is not docked. When we try to save its state
// later, the DockZoneID will be empty. To workaround this problem we will
// set the AutoPostBack property of the RadDock control to true and will
// attach an AsyncPostBackTrigger for the DockPositionChanged client-side
// event. This will initiate second AJAX request in order to save the state
// AFTER the dock was docked in RadDockZone1.
CreateSaveStateTrigger(dock);
}
}
}
Thanks

SqlCommand command = new SqlCommand("select State from dockState where id=1", _conn);
But in SaveDockLayout , the command is with id=3:
SqlCommand command = new SqlCommand(String.Format("update DockState set State='{0}' where id=3", dockState), _conn);
On my opinion the id should be equal in both cases.
P.S You can use the FormatCodeBlock tool when you paste a code from VS to RadEditor