Move/update dock results in reload of entire page

2 posts, 0 answers
  1. Thomas
    Thomas avatar
    14 posts
    Member since:
    Mar 2012

    Posted 17 Jul 2012 Link to this post

    This is probably a classic issue regarding update of dock content, but I can't get the docks to update or move the docks without the entire page is reloaded.

    My code is base on an example I found here in the forum written by Telerik, and I have only made a few modifications.

    I have moved public List<DockState> GetCurrentDockStates(string userkey, string frmName) to a widget class.

    On page_init the docks are initiated from state. On page_load docks that are not in state are initiated and ascx controls are then loaded for all docks. 

    I have 2 main problems.

    1. I can't move or minimize a dock without the entire page reloads. If it isn't possible to move one dock without having to recreate all docks registered in the given RadDockLayout when I want to save the state (which is what I'm doing now), that is fine if just the RadDock components and their content is reloaded but the top menu and the rest of the page isn't. How can I change my code to achieve that?

    2. I can't update the content of one dock without the entire page reloads. How can I update the content of one dock without the other docks or other page content is reloaded?

    Hope someone here can help me out.

    Thanks.

    /Thomas


    Widget class .aspx

            public List<DockState> GetCurrentDockStates(string userkey, string frmName)
            {
                //Get saved state string from the database - set it to dockState variable for example
                string dockStatesFromDB = "";
                dockStatesFromDB = DbUtils.GetUserSettings(userkey, frmName, settingsKey);
                List<DockState> _currentDockStates = new List<DockState>();
                if ((dockStatesFromDB != null) && (dockStatesFromDB != ""))
                {
                    string[] stringStates = dockStatesFromDB.Split(';');
                    foreach (string stringState in stringStates)
                    {
                        if (stringState.Trim() != string.Empty)
                        {
                            _currentDockStates.Add(DockState.Deserialize(stringState));
                        }
                    }
                }
                return _currentDockStates;
            }


    Default.aspx.cs

     

        protected void RadDockLayout1_LoadDockLayout(object sender, DockLayoutEventArgs e)
        {
                Widget _widget = new Widget();
                List<DockState> _currentDockStates = _widget.GetCurrentDockStates((Session[TCSessionConst.SessionFrmDefault_XpoUser] as XpoUser).KeyID, DebugFormName);
                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)
        {

            List<DockState> stateList = RadDockLayout1.GetRegisteredDocksState();

            StringBuilder serializedList = new StringBuilder();

            Widget _widget = new Widget();
            List<DockState> _currentDockStates = _widget.GetCurrentDockStates((Session[TCSessionConst.SessionFrmDefault_XpoUser] as XpoUser).KeyID, DebugFormName);
            bool state_closed;
            foreach (DockState _dockState in stateList)
            {
                state_closed = false;
                foreach (DockState _dockState2 in _currentDockStates)
                {
                    if (_dockState2.UniqueName == _dockState.UniqueName)
                    {
                        if (_dockState2.Closed)
                        {
                            state_closed = true;
                            serializedList.Append(_dockState2.ToString());
                            serializedList.Append(";");
                        }
                    }
                }
                if (!state_closed)
                {
                    serializedList.Append(_dockState.ToString());
                    serializedList.Append(";");
                }
            }

            string dockState = serializedList.ToString();
            if (dockState.Trim() != String.Empty)
            {
                DbUtils.SetUserSetting((Session[TCSessionConst.SessionFrmDefault_XpoUser] as XpoUser).KeyID, "Default", "WidgetState", dockState);
            }

        }

        private RadDock CreateRadDockFromState(DockState state)
        {
            Widget widget = new Widget();
            XPOWidgetSettings xpoWidgetSettings = widget.getWidgetSettingsObjectById(state.UniqueName);

            RadDock dock = new RadDock();
            dock.DockMode = DockMode.Docked;
            dock.ID = string.Format("RadDock{0}", state.UniqueName);
            dock.ApplyState(state);
            DockExpandCollapseCommand cmd = new DockExpandCollapseCommand();
            dock.Commands.Add(cmd);
            return dock;
        }

        private RadDock CreateRadDock(string oid, string displayName, string widgetSettings)
        {
            RadDock dock = new RadDock();
            dock.DockMode = DockMode.Docked;
            dock.UniqueName = oid;
            dock.ID = string.Format("RadDock{0}", dock.UniqueName);

            DockCloseCommand closeCmd = new DockCloseCommand();
            dock.Commands.Add(closeCmd);
            DockExpandCollapseCommand cmd = new DockExpandCollapseCommand();
            dock.Commands.Add(cmd);

            return 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;

            AjaxUpdatedControl updatedControl = new AjaxUpdatedControl();
            updatedControl.ControlID = "Panel1";

            AjaxSetting setting1 = new AjaxSetting(dock.ID);
            setting1.EventName = "DockPositionChanged";
            setting1.UpdatedControls.Add(updatedControl);

            AjaxSetting setting2 = new AjaxSetting(dock.ID);
            setting2.EventName = "Command";
            setting2.UpdatedControls.Add(updatedControl);

            RadAjaxManager1.AjaxSettings.Add(setting1);
            RadAjaxManager1.AjaxSettings.Add(setting2);
        }

        private void LoadUserWidgets()
        {
            Widget widget = new Widget();
            string radDockID;
            string displayName;
            string settingString;

            List<DockState> _currentDockStates = widget.GetCurrentDockStates((Session[TCSessionConst.SessionFrmDefault_XpoUser] as XpoUser).KeyID, DebugFormName);
            XPCollection widgetSettingsObjectsByUserLevel = widget.getWidgetSettingsObjectsByUserLevel((Session[TCSessionConst.SessionFrmDefault_XpoUser] as XpoUser).Userrole);

            Boolean _doContinue;
            foreach (XPOWidgetSettings _widgetSetting in widgetSettingsObjectsByUserLevel)
            {
                _doContinue = false;
                radDockID = _widgetSetting.Oid.ToString();
                displayName = _widgetSetting.DisplayName;
                settingString = _widgetSetting.Settings;

                foreach (DockState _ds in _currentDockStates)
                {
                    if (_ds.UniqueName == radDockID)
                        _doContinue = true;
                }
                if (_doContinue) continue;
                RadDock dock = CreateRadDock(radDockID, displayName, settingString);
                //find the target zone and add the new dock there

                //adding the dock to the docklayout and then docking it to the zone to avoid ViewState issues on subsequent postback
                RadDockLayout1.Controls.Add(dock);

                dock.Dock(DZCenter);

     

                CreateSaveStateTrigger(dock);

                //Load the selected widget in the RadDock control
                dock.Tag = _widgetSetting.AscxFile;
                LoadWidget(dock);
            }
        }

        private void LoadWidget(RadDock dock)
        {
            string siteUrl = TCFramework.TCConfigSettings.HostUrlGroups + Session[TCSessionConst.SessionFrmDefault_SelGroup];
            string userName = (Session[TCSessionConst.SessionFrmDefault_XpoUser] as XpoUser).Username;
            string password = (Session[TCSessionConst.SessionFrmDefault_XpoUser] as XpoUser).GetPassword();
            string ascxFile = "";
            string settings = "";

            string oId = dock.UniqueName;

            Widget widget = new Widget();
            XPOWidgetSettings xpoWidgetSettings = widget.getWidgetSettingsObjectById(oId);

            ascxFile = xpoWidgetSettings.AscxFile;
     settings = xpoWidgetSettings.Settings;

            Control widgetControl = LoadControl(ascxFile);
            if (widgetControl != null)
             dock.ContentContainer.Controls.Add(widgetControl);
        }

        private void CreateDocksFromStateDB()
        {
            Widget _widget = new Widget();
            List<DockState> _currentDockStates = _widget.GetCurrentDockStates((Session[TCSessionConst.SessionFrmDefault_XpoUser] as XpoUser).KeyID, DebugFormName);
            for (int i = 0; i < _currentDockStates.Count; i++)
            {
                RadDock dock = CreateRadDockFromState(_currentDockStates[i]);
                dock.Visible = !_currentDockStates[i].Closed;
                RadDockLayout1.Controls.Add(dock);

                //We want to save the dock state every time a dock is moved.

                if (dock.Visible) CreateSaveStateTrigger(dock);
            }
        }

     

        protected void Page_Init(object sender, EventArgs e)
        {
            CreateDocksFromStateDB();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            foreach (RadDock _rd in RadDockLayout1.RegisteredDocks)
                try
                {
                    LoadWidget(_rd);
                }
                catch
                {
                    //error in loading widget _rd.
                }

            if (!IsPostBack)
            {
                LoadUserWidgets();
            }
        }


    Default.aspx

        <div>
            <telerik:RadDockLayout ID="RadDockLayout1" runat="server"
                onloaddocklayout="RadDockLayout1_LoadDockLayout"
                onsavedocklayout="RadDockLayout1_SaveDockLayout">
                <table width="100%" cellpadding="12px">
                    <tr>
                        <td width="25%" valign="top">
                            <telerik:RadDockZone ID="DZLeft" runat="server" BackColor="#BFDBFF"
                                ForeColor="#BFDBFF">
                            </telerik:RadDockZone>
                        </td>
                        <td width="50%" valign="top">
                            <telerik:RadDockZone ID="DZCenter" runat="server" BackColor="#BFDBFF"
                                Visible="True" ForeColor="#BFDBFF">
                            </telerik:RadDockZone>
                        </td>
                        <td width="25%" valign="top">
                            <telerik:RadDockZone ID="DZRight" runat="server" BackColor="#BFDBFF"
                                ForeColor="#BFDBFF">
                            </telerik:RadDockZone>
                        </td>
                    </tr>
                </table>
            </telerik:RadDockLayout>
        </div>
        <div style="width: 0px; height: 0px; overflow: hidden; position: absolute; left: -10000px;">
            Hidden UpdatePanel, which is used to help with saving state when minimizing, moving
            and closing docks. This way the docks state is saved faster (no need to update the
            docking zones).
            <asp:UpdatePanel runat="server" ID="UpdatePanel1">
            </asp:UpdatePanel>
        </div>

  2. Thomas
    Thomas avatar
    14 posts
    Member since:
    Mar 2012

    Posted 19 Jul 2012 Link to this post

    I had an error in my private void CreateSaveStateTrigger(RadDock dock) which caused the entire reload of page when a dock was moved.
  3. UI for ASP.NET Ajax is Ready for VS 2017
Back to Top