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);}