I use dockzone to load docks in. each dock is user control. I have a dropdownlist which user select and then it will load the existing dockstates
the issue now is that the dock order mess up after I switch dropdownlist selection. example: for dropdownlist, it has value "a" and value "b". when I select value "A", it will load dockstate1 and then when I select value "b", it will load dockstate2 from database. now I select value "A" and the dockstate1 is loaded and docks are ordered correctly. then I change some dock's postion by drag and drop. every thing works fine and dock index saved to database with correct number. then I select value "b" so dockstate2 is loaded. Then I reselect value "a", the dockstate1 is reloaded from database with correct index but the dock orders are changed. they order with the Alphbetic instead of the previous order. I found the dock/state index value changed after RadDockLayout1.GetRegisteredDocksState() is called. why the dock index change ? Please see rough codes
any suggestion?
Thanks
Helena
Protected Sub RadDockLayout1_LoadDockLayout(ByVal sender As Object, ByVal e As DockLayoutEventArgs) Handles RadDockLayout1.LoadDockLayout
'Populate the event args with the state information. The RadDockLayout control
' will automatically move the docks according that information.
'If isNeedReload Then
Dim state As DockState
Dim intIndex As Integer
Dim serializer As Script.Serialization.JavaScriptSerializer = New Script.Serialization.JavaScriptSerializer()
Dim stateList As List(Of DockState) = Me.RadDockLayout1.GetRegisteredDocksState()
If Not stateList Is Nothing Then
For Each state In stateList
e.Positions(state.UniqueName) = state.DockZoneID
e.Indices(state.UniqueName) = state.Index
Next
End If
End If
End Sub
Protected Sub RadDockLayout1_SaveDockLayout(ByVal sender As Object, ByVal e As DockLayoutEventArgs) Handles RadDockLayout1.SaveDockLayout
Dim strMethodName As String = Me.strClassName & "RadDockLayout1_SaveDockLayout"
Try
Dim stateList As List(Of DockState) = Me.RadDockLayout1.GetRegisteredDocksState()
//on stateList , the dock index changed ????
End sub
Protected Sub RadComBoxView_SelectedIndexChanged(ByVal o As Object, ByVal e As Telerik.Web.UI.RadComboBoxSelectedIndexChangedEventArgs) Handles RadComBoxView.SelectedIndexChanged
Dim strMethodName As String = Me.strClassName & "RadComBoxView_SelectedIndexChanged"
Try
If Not Me.RadComBoxView.SelectedItem Is Nothing Then
'reset SystemUserWidgetID
SystemUserWidgetID = -1
Me.CurrentViewTypeID = Me.RadComBoxView.SelectedItem.Value
'need to load WidgetState based on viewid
Me.GetUserWidgetState()
CreateWidgetStates()
End if
End Sub
10 Answers, 1 is accepted
Thanks
Helena
Since the order of RadDocks is not persisted correctly, most probably the layout of the dock controls is not saved or there are problems with loading it. I am willing to help you, but I will need a fully runnable project in order to inspect how the docks are created and added on the page, how is their layout saved and then loaded. I can suggest checking the online demo My Portal as it is a good example of loading RadDocks dynamically and saving their state.
Please note that currently I am mostly guessing as to what your setup is. If the encountered issue persist, please prepare and send a sample, runnable project that isolates the problem at hand so that we can examine it locally and suggest an appropriate solution.
Greetings,
Slav
the Telerik team
Hi Slav:
Thanks for your information. the link for submit solution doesn't work .Can I exmplain my code and logical instead of building runable project? I use SQL2000 and can't create MDF
Basically I can't load dock from widgetstate on page Init event. the reason is that I need to get data from other events which is fired after page_init then I can load dock after the event fired.
so the process is:
1. on page init, no load for dock
2.on Radcombox select index to load widgetstate from the database based on what I selected from Radcombox
3.after I load widgetstate from the database then I create dock from this widgetstate
4. then RadDockLayout1_LoadDockLayout event fire
5. then RadDockLayout1_SaveDockLayout event fired. actually I shouldn't need call this event since the widgetState is loaded from database and nothing changed
I will copy codes based on this steps. can you please look at to help out my issue?
1.Radcombox select index event:
Protected Sub RadComBoxView_SelectedIndexChanged(ByVal o As Object, ByVal e As Telerik.Web.UI.RadComboBoxSelectedIndexChangedEventArgs) Handles RadComBoxView.SelectedIndexChanged
Try
If Not Me.RadComBoxView.SelectedItem Is Nothing Then
'reset SystemUserWidgetID
SystemUserWidgetID = -1
Me.CurrentViewTypeID = Me.RadComBoxView.SelectedItem.Value
'load widgetList based on viewid
Me.LoadWidgetList(Me.CurrentViewTypeID)
BindWidgetList()
'need to load WidgetState based on viewid
Me.GetUserWidgetState()
If SystemUserWidgetID <= 0 Then
'add default Widget if user has no widgets yet
CreateDefaultRadDock()
Else
CreateWidgetStates()
End If
Me.reLoadWidgetControlData()
End If
Catch AppException As Exception
Finally
End Try
End Sub
'+---------------------------------------------------------------------------------------------
'| Method : GetUserDockState
'| Purpose : retrieve user last Dockstate then save it to the session. If user has no dockstate
'| then load all the controls which belong to user's defauult dockviewtype
'| Parameters : None
'| Returns : None
'+---------------------------------------------------------------------------------------------
Private Sub GetUserWidgetState()
Dim ds As DataSet
Dim dr As DataRow
Dim dt As DataTable
Dim drRow As DataRow
Dim strDockState As String
Dim objBS As New NIS.BusinessServices.Widget()
objBS.SystemUserID = SystemUserID
Dim strMethodName As String = Me.strClassName & "GetUserWidgetState"
Try
If SystemUserWidgetID > 0 Then
'get user existing WidgetState
ds = objBS.GetSystemUserWidgetStateByUserWidgetID(SystemUserWidgetID)
Else
ds = objBS.GetSystemUserWidgetStateByViewTypeID(Me.CurrentViewTypeID)
If Not ds Is Nothing AndAlso Not ds.Tables(0) Is Nothing > 0 Then
dt = ds.Tables(0)
If Not dt Is Nothing AndAlso Not dt.Rows Is Nothing AndAlso dt.Rows.Count > 0 Then
SystemUserWidgetID = GS.Null2Zero(ds.Tables(0).Rows(0)("SystemUserWidgetID"))
Else
SystemUserWidgetID = 0
End If
Else
SystemUserWidgetID = 0
End If
End If
CommonMethods.SetFormDataSet(GS.tblSystemUserWidget, ds)
Catch AppException As Exception
LogMessage(UserToken(), GS.msgInternalApplicationErrorID, strMethodName, Now, Now, AppException.Message)
Finally
CommonMethods.cleanupDataSet(ds)
CommonMethods.CleanUpObject(objBS)
End Try
End Sub
Private Function CreateRadDockFromState(ByVal state As DockState) As RadDock
Dim dock As New RadDock()
dock.DockMode = DockMode.Docked
Dim strMethodName As String = Me.strClassName & "CreateRadDockFromState"
Dim strID As String()
Dim strURLType As String
Try
With dock
'.Skin = "NISCustomSkin"
.Skin = GetSkinNameByViewTypeiD(Me.CurrentViewTypeID)
.EnableEmbeddedSkins = True
.Commands.Clear()
.DockMode = DockMode.Docked
.UniqueName = state.UniqueName
.ID = state.UniqueName
.Title = state.Tag
'dock.tag need to be virtual path
.Tag = state.Tag
.EnableAnimation = True
.EnableRoundedCorners = "true"
.Width = Unit.Percentage(100)
'.BorderWidth = Unit.Pixel(1)
'dock.BorderColor = Color.LightGray
.Text = state.Text
.AutoPostBack = True
.ApplyState(state)
.Visible = Not state.Closed
End With
''set up different CSS for ProgressNote
If dock.ID = "wucWidgetProgressNote.ascx" Then
dock.Height = 0
dock.CssClass = "NotesrdContent"
dock.OnClientInitialize = "DockInitialize"
End If
'check if Dock is belong to any pop up
dock.Attributes.Add("text", state.Text)
'add Close command
Dim DockCloseCommand As New DockCloseCommand
'DockCloseCommand.OnClientCommand = "DockCloseCommandClick"
DockCloseCommand.AutoPostBack = True
dock.Commands.Add(DockCloseCommand)
Dim DOckCollapseCommand As New DockExpandCollapseCommand
DOckCollapseCommand.AutoPostBack = True
dock.Commands.Add(DOckCollapseCommand)
'Insert first Custom command --view Detail to the dockable object
If strURLType <> String.Empty AndAlso (strURLType = "1" Or strURLType = "2") Then
Dim customCommand As New DockCommand
With customCommand
.Text = "Details"
.Name = "Details"
.CssClass = "CustomCommandCss" ' it is for css to use default Dock customcommand image
'.CssClass = "CommandClass" 'it is the style sheet to disolay telerik default image for custom command
.OnClientCommand = "DockDetailCommandClick"
.AutoPostBack = False
End With
dock.Commands.Add(customCommand)
End If
Catch AppException As Exception
Finally
End Try
Return dock
End Function
2.
Protected Sub RadDockLayout1_LoadDockLayout(ByVal sender As Object, ByVal e As DockLayoutEventArgs) Handles RadDockLayout1.LoadDockLayout
'Populate the event args with the state information. The RadDockLayout control
' will automatically move the docks according that information.
'If isNeedReload Then
Dim state As DockState
Dim intIndex As Integer
If ExternalPatientID > 0 Then
If Not RadDockZone3.Docks Is Nothing Then
intIndex = RadDockZone3.Docks.Count
End If
Dim serializer As Script.Serialization.JavaScriptSerializer = New Script.Serialization.JavaScriptSerializer()
Dim stateList As List(Of DockState) = Me.RadDockLayout1.GetRegisteredDocksState()
'If Not CurrentWidgetStates Is Nothing Then
If Not stateList Is Nothing Then
For Each state In stateList
If state.Closed Then
state.DockZoneID = "ctlwucWidgets_RadDockZone3"
state.Index = intIndex
End If
e.Positions(state.UniqueName) = state.DockZoneID
e.Indices(state.UniqueName) = state.Index
Next
End If
End If
End Sub
Protected Sub RadDockLayout1_SaveDockLayout(ByVal sender As Object, ByVal e As DockLayoutEventArgs) Handles RadDockLayout1.SaveDockLayout
Dim strMethodName As String = Me.strClassName & "RadDockLayout1_SaveDockLayout"
Try
If ExternalPatientID > 0 Then
Dim stateList As List(Of DockState) = Me.RadDockLayout1.GetRegisteredDocksState()
Dim serializedList As New StringBuilder()
Dim i As Integer = 0
Dim objWidget As New NIS.BusinessServices.WidgetTrans()
objWidget.SystemUserID = SystemUserID
Dim drRow As DataRow
While i <
stateList.Count
serializedList.Append(stateList(i).ToString()) 'serializedList.Append(serializer.Serialize(stateList(i)))
serializedList.Append("|")
System.Math.Max(System.Threading.Interlocked.Increment(i), i - 1)
End While
Dim strWidgetState As
String
=
serializedList
.ToString()
'Save the dockState string into DB
'If strWidgetState.Trim() <> String.Empty Then
objWidget.UserToken = UserToken
SystemUserWidgetID = objWidget.SaveUserWidget(SystemUserWidgetID, Me.CurrentViewTypeID, strWidgetState)
'update the lastviewtypeid in order to use when navigate from other pages
UserProfile("LastViewTypeID") = Me.CurrentViewTypeID
'update Widget
If Not FormData.Tables(GS.tblSystemUserWidget) Is Nothing AndAlso FormData.Tables(GS.tblSystemUserWidget).Rows.Count > 0 Then
drRow = FormData.Tables(GS.tblSystemUserWidget).Rows(0)
drRow.Item("WidgetStates") = IIf(strWidgetState = String.Empty, DBNull.Value, strWidgetState)
Else
GetUserWidgetState()
End If
SetControlData()
''set up the docklist
End If
Catch AppException As Exception
LogMessage(UserToken(), GS.msgInternalApplicationErrorID, strMethodName, Now, Now, AppException.Message)
Finally
End Try
End Sub
I think I kindly figured out why my dock order issue but I am not sure how to fix it
Basically on my situation, when I change the selection from the RadCombox, I couldn't load dock from the page_init since I need to reload the dockstate from the database on the selectindex change event which is fired after page_init and after the
RadDockLayout1_LoadDockLayout
. so on RadDockLayout1_SaveDockLayout, the state is not correct when I retrieved from RadDockLayout1.GetRegisteredDocksState(). I am still confused why the index changed automatically but I am assuming I need to fireRadDockLayout1_LoadDockLayout
after I get the latest state from the database. so the question is that how I can fireRadDockLayout1_LoadDockLayout manually ? Could you please help out with this issue and I really need to fix it asap
Thanks
Helena
I will explain the process of persisting the layout of the RadDocks so that you can get better understanding of it and check if there is something incorrect in your implementation:
1. On Page_Init the RadDocks that were present on the page before postback are recreated based on the state saved in the data base.
2. On RadDockLayout_LoadDockLayout the position and the index of every RadDock is recovered from the state, saved in the data base.
3. On RadDockLayout_SaveDockLayout the new state of the RadDocks is taken from the method of the RadDockLayout GetRegisteredDocksState() and it is stored in the data base to be used on a new page load.
Since RadDockLayout_LoadDockLayout is raised always in the correct moment of the page lifecycle, you won't need to fire it manually. Also, I checked the provided code samples and I wasn't able to detect what may be causing the issue. Note that I will need to examine your full code in order to detect the exact cause as the presented parts doesn't create a complete picture of your implementation.
Please find attached a sample project that demonstrates the default setup, utilized in such cases. You can compare it with your actual project and check if there are differences in the implementation. I would suggest trying to modify it so that the problem is reproducible or preparing a sample, runnable project that isolates the problem at hand and sending it to clientservice@telerik.com so that we can examine it locally and provide a more to the point answer.
Regards,
Slav
the Telerik team
Thanks for your explaination. so my code does have issue. I have to load the widgetstate from the database on the selectindexchange event instead of pate_init. It means I only can get all the state after LoadDockLayout fired since the Radcombox selectedindexchange event fire after page_init and after LoadDockLayout . is any way that I call LoadDockLayout after the selectedindexchange event ?
Thanks
Helena
I tried to copy all the codes from RadCombox selectindexChange event to Page_init. then the Dock order issue is fixed. but as I mentioned, I have to leave code inside RadCombox selectindexChange in order to get some data informatio. so my issue or solution is : is it possible to do the same function which Load_layout do (the position and the index of every RadDock is recovered from the state, saved in the data base.) ouotside page_init?
Thanks
Helena
Thank you for the sample and the description of your implementation. After examining your code I have several suggestions for improving your project:
1. For setting the index and position of the RadDocks outside the event LoadDockLayout you can use the method SetRegisteredDockParents of RadDockLayout, which is demonstrated in the online demo Dock / Load/Save Layout.
2. I would recommend separating the logic for recreating the RadDocks in the according events - you can load the controls on Init and populate them with additional information on SelectedIndexChanged of the RadComboBox control.
3. I noticed that in the handler of the server-side event LoadDockLayout you are using the state, returned from the GetRegisteredDocksState method of the RadDockLayout.
Dim
stateList
As
List(Of DockState) =
Me
.RadDockLayout1.GetRegisteredDocksState()
This is incorrect, as for setting the correct position and index of the recreated RadDocks you should utilize the data, stored in the data base.
I hope the information listed above will help you in resolving the issue.
Greetings,
Slav
the Telerik team
Thanks for your information.Can you please confirm why the viewstate varibale is missing after I drag and drop the dock? I have to use session instead of viewstate now to keep variable value.but I can't understand why the viewstate will not work when drag and drop
dock ( dock position change). Also can you please tell me how I can tell dock is drag and drop event? example: I can tell if the event is from RadCombox by checking the eventTarget . is any way for me to tell the page refresh because of dock drag and drop. I only need to save dockstate when dock change position or dock close ( by dock command) so want to know how to check
eventTarget = Page.Request.Params.Get("__EVENTTARGET")
If eventTarget.Contains("RadComBoxView") Then
........
Thanks
Helena'
Indeed, the variable SystemUserWidgetID which is stored in ViewState is missing after a postback. This happens because you are setting its value on the RadDockLayout's event SaveDockLayout, which is raised after the ViewState of the page and its controls is saved, as you can check in this article. An alternative approach, that you may consider if you want to keep using the SaveDockLayout event for this purpose, is to store the current index of the RadComboBox in a hidden field instead of the ViewState.
If you want to save the state of the RadDock controls only when a dock is dragged or a command is clicked, you can use its server-side events Command and DockPositionChanged in order to set a flag, indicating that the state of the RadDocks should be saved. In the handler of the event SaveDockLayout you will save the state only if this flag is set.
Kind regards,
Slav
the Telerik team