Hi,
I'm trying to create dynamic dock controls with customs command in their title bar. I've read everywhere that those dock must be re-created in the OnInit event which I think I'm doing.
Here's my code:
1 - I'm adding a dock to the DockLayout by clicking on a radbutton (RadButtonCreate_Click) and load a control within that dock via Loadcontrol.
Everything looks fine at that stage.
2 - When I click on my custom command "SaveToDB", it does work the way I like and insert all the data to the DB and update the title of my dock via a Dock Title Template implementing ITemplate.
3 - When I click again on that command "SaveToDB", nothing happens. The OnClientCommand is fired but the server side handler is no longer called.
What am I doing wrong here ?
I'm trying to create dynamic dock controls with customs command in their title bar. I've read everywhere that those dock must be re-created in the OnInit event which I think I'm doing.
Here's my code:
1 - I'm adding a dock to the DockLayout by clicking on a radbutton (RadButtonCreate_Click) and load a control within that dock via Loadcontrol.
Everything looks fine at that stage.
2 - When I click on my custom command "SaveToDB", it does work the way I like and insert all the data to the DB and update the title of my dock via a Dock Title Template implementing ITemplate.
3 - When I click again on that command "SaveToDB", nothing happens. The OnClientCommand is fired but the server side handler is no longer called.
What am I doing wrong here ?
private List<
DockState
> CurrentDockStates
{
get
{
//Store the info about the added docks in the session. For real life
// applications we recommend using database or other storage medium
// for persisting this information.
List<
DockState
> _currentDockStates = (List<
DockState
>)Session["CurrentDockStatesDynamicDocks"];
if (Object.Equals(_currentDockStates, null))
{
_currentDockStates = new List<
DockState
>();
Session["CurrentDockStatesDynamicDocks"] = _currentDockStates;
}
return _currentDockStates;
}
set
{
Session["CurrentDockStatesDynamicDocks"] = value;
}
}
private RadDock CreateRadDockFromState(DockState state)
{
RadDock dock = new RadDock();
try
{
dock.ID = string.Format("RadDock{0}", state.UniqueName);
dock.ApplyState(state);
dock.EnableRoundedCorners = true;
dock.Command += new DockCommandEventHandler(dock_Command);
dock.Commands.Add(new DockCloseCommand());
dock.Commands.Add(new DockExpandCollapseCommand());
var dockSaveCmd = new DockCommand();
dockSaveCmd.Name = "SaveToDB";
dockSaveCmd.Text = "Save";
dockSaveCmd.CssClass = "sdSaveCmd";
dockSaveCmd.OnClientCommand = "SaveStopToDB";
dock.Commands.Add(dockSaveCmd);
}
catch (Exception ex)
{
return null;
throw new Exception(ex.Message, ex.InnerException);
}
return dock;
}
protected void Page_Init(object sender, EventArgs e)
{
//Recreate the docks in order to ensure their proper operation
for (int i = 0; i < CurrentDockStates.Count; i++)
{
RadDock dock = CreateRadDockFromState(CurrentDockStates[i]);
RadDockLayout1.Controls.Add(dock);
CreateSaveStateTrigger(dock);
}
}
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);
}
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);
}
else if (e.Command.Name == "SaveToDB")
{
var dock = ((RadDock)sender);
var stop = new Stop()
{
Id = int.Parse(dock.Tag),
Name = ((RadTextBox)stopCtrl.FindControl("rtbName")).Text,
Description = ((RadTextBox)stopCtrl.FindControl("TB_description")).Text,
};
if (stop.Id < 0)
{
stop.Id = stop.Insert();
dock.Tag = stop.Id.ToString();
}
else
stop.Update();
}
}
protected void RadDockLayout1_LoadDockLayout(object sender, DockLayoutEventArgs e)
{
//Populate the event args with the state information. The RadDockLayout control
// will automatically move the docks according that information.
foreach (DockState state in CurrentDockStates)
{
e.Positions[state.UniqueName] = state.DockZoneID;
e.Indices[state.UniqueName] = state.Index;
}
}
protected void RadDockLayout1_SaveDockLayout(object sender, DockLayoutEventArgs e)
{
//Save the dock state in the page Session. This will enable us
// to recreate the dock in the next Page_Init.
CurrentDockStates = RadDockLayout1.GetRegisteredDocksState();
}
protected void RadButtonCreate_Click(object sender, EventArgs e)
{
var dock = new RadDock();
dock.DockMode = DockMode.Docked;
dock.EnableRoundedCorners = true;
dock.UniqueName = Guid.NewGuid().ToString();
dock.ID = string.Format("RadDock{0}", dock.UniqueName);
dock.Tag = "-1";
StopFormTplEmpty widget = (StopFormTplEmpty)GlobalUtils.LoadControl(this, "~/Templates/StopFormTplEmpty.ascx");
widget.EnableViewState = true;
dock.ContentContainer.Controls.Add(widget);
dock.TitlebarTemplate = new DockTitleTemplate(dock, StopType.Unknown, "New");
dock.Width = Unit.Percentage(100);
dock.Height = Unit.Pixel(420);
dock.Commands.Add(new DockCloseCommand());
dock.Commands.Add(new DockExpandCollapseCommand());
var dockSaveCmd = new DockCommand();
dockSaveCmd.Name = "SaveToDB";
dockSaveCmd.Text = "Save";
dockSaveCmd.CssClass = "sdSaveCmd";
dockSaveCmd.OnClientCommand = "SaveStopToDB";
dock.Commands.Add(dockSaveCmd);
dock.CommandsAutoPostBack = true;
dock.Command += new DockCommandEventHandler(dock_Command);
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}'),{2});
$find('{0}').doPostBack('DockPositionChanged');
}};
Sys.Application.add_load(_addDock);", dock.ClientID, RadDockZoneStops.ID, 0),
true);
CreateSaveStateTrigger(dock);
}