Hello,
Here is my situation. I am developing a portal page using Raddocks. On top of the page I will have a rad grid which will have a linkbutton with an onclick event on server side. When the user clicks on a linkbutton of a specific row of a radgrid, a new widget/dock should be created and added to the Layout.
Every dock has a usercontrol in it which is loaded via a webservice. I am saving the state in the database from client side. My issue here is that whenever I am creating a new dock, all the existing docks are getting recreated and all the usercontrols are getting loaded again. I just want the user selected dock to be loaded.
I know that I can use AsyncPostBackTrigger, but I am getting an error that it is not able to find the control that I am clicking(btnAddWidget) which is inside a RadGrid. I was wondering if there is any other way to handle this without having to re-create all the docks again. I have the flexibility to replace the RadGrid with any other control like a listview or something.
The following is my code:
Default.aspx:
function OnClientDockPositionChanged(dock, args) {
SaveState();
}
function OnClientResizeEnd(dock, args) {
SaveState();
}
function OnClientCommand(dock, args) {
SaveState();
}
function SaveState() {
var i;
var state = "";
var zone1 = $find("RadDockZone1");
var zone2 = $find("RadDockZone2");
var array1Docks = zone1.get_docks();
var array2Docks = zone2.get_docks();
for (i = 0; i < array1Docks.length; i++) {
var dock = array1Docks[i];
var dockID = dock.get_id();
var tag = $get(dockID).attributes["tag"].value;
state = state + tag + "#" + array1Docks[i].saveClientState() + "|";
}
for (i = 0; i < array2Docks.length; i++) {
var dock = array2Docks[i];
var dockID = dock.get_id();
var tag = $get(dockID).attributes["tag"].value;
state = state + tag + "#" + array2Docks[i].saveClientState() + "|";
}
SOLEWebService.VerifyUserSessionAndUpdateUserSettings(state, success, onFail);
}
function success(result) {
alert("success");
}
function onFail(result) {
alert(result.d);
}
function OnClientInitialize(dock, args) {
var dockID = dock.get_id();
var tag = $get(dockID).attributes["tag"].value;
var UserControl = $get(dockID).attributes["UserControl"].value;
if ($get(dockID).attributes["NewDock"] != null && $get(dockID).attributes["NewDock"].value != null) {
var newDock = $get(dockID).attributes["NewDock"].value;
var state = "";
state = tag + "#" + dock.saveClientState() + "|";
SOLEWebService.VerifyUserSessionAndSaveUserSettings(state, success, onFail);
}
UserControlService.GetUserWidgetData(UserControl, tag, function (result) {
$get(dockID + "_C").innerHTML = result;
});
}
<script src="/Scripts/JQuery/Scripts/JQuery-1.4.1-vsdoc.js" type="text/javascript"></script>
</head>
<body>
<form id="form1" runat="server">
<telerik:RadScriptManager runat="server" ID="RadScriptManager1" EnablePageMethods = "true" EnableScriptCombine="true">
<Services>
<asp:ServiceReference Path = "~/UserControlService.asmx" />
<asp:ServiceReference Path = "~/SOLEWebService.asmx" />
</Services>
</telerik:RadScriptManager>
<telerik:RadStyleSheetManager ID="RadStyleSheetManager1" runat="server" EnableStyleSheetCombine="true">
</telerik:RadStyleSheetManager>
<telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server" ClientEvents-OnResponseEnd = "RecallJquery">
<asp:UpdatePanel runat="server" ID="UpdatePanel1">
<ContentTemplate>
<table>
<tr>
<td>
<div id = "gridViewPanel" class = "ContainerPanel">
<div id="gridViewHeader" class="collapsePanelHeader">
<div id="Div2" class="HeaderContent">Add Stuff</div>
<div id="Div3" class="ArrowClose"></div>
</div>
<div id = "gridContent" class = "Content" style="display:none">
<telerik:RadGrid runat="server" ID="grdWidgets" OnNeedDataSource="grdWidgets_NeedDataSource"
AllowPaging="True" Width="400px" >
<MasterTableView DataKeyNames="Widgets" Width="100%" TableLayout="Fixed">
<Columns>
<telerik:GridTemplateColumn UniqueName="TemplateColumn" HeaderText="" ItemStyle-Width = "50px">
<ItemTemplate>
<asp:Panel ID="Panel1" runat="server">
<asp:LinkButton ID="btnAddWidget" runat="server" Text = "Add" OnClick = "btnAddWidget_Click" />
</asp:Panel>
</ItemTemplate>
</telerik:GridTemplateColumn>
</Columns>
</MasterTableView>
<ClientSettings AllowRowsDragDrop="True">
<Selecting AllowRowSelect="True" EnableDragToSelectRows="false" />
<Scrolling AllowScroll="true" UseStaticHeaders="true" ScrollHeight="320px" />
</ClientSettings>
<PagerStyle Mode="NumericPages" PageButtonCount="4" />
</telerik:RadGrid>
</div>
</div>
</td>
</tr>
</table>
<telerik:RadDockLayout runat="server" ID="RadDockLayout1" OnLoadDockLayout="RadDockLayout1_LoadDockLayout">
<table>
<tr>
<td style="vertical-align: top">
<telerik:RadDockZone ID="RadDockZone1" runat="server" Orientation="Vertical" Width="250px"
MinHeight="400px">
</telerik:RadDockZone>
</td>
<td style="vertical-align: top">
<telerik:RadDockZone ID="RadDockZone2" runat="server" Orientation="Vertical" Width="560px"
MinHeight="400px">
</telerik:RadDockZone>
</td>
</tr>
</table>
</telerik:RadDockLayout>
</ContentTemplate>
<%-- <Triggers>
<asp:AsyncPostBackTrigger ControlID="btnAddWidget" EventName="Click" />
</Triggers>--%>
</asp:UpdatePanel>
</telerik:RadAjaxPanel>
Here is my situation. I am developing a portal page using Raddocks. On top of the page I will have a rad grid which will have a linkbutton with an onclick event on server side. When the user clicks on a linkbutton of a specific row of a radgrid, a new widget/dock should be created and added to the Layout.
Every dock has a usercontrol in it which is loaded via a webservice. I am saving the state in the database from client side. My issue here is that whenever I am creating a new dock, all the existing docks are getting recreated and all the usercontrols are getting loaded again. I just want the user selected dock to be loaded.
I know that I can use AsyncPostBackTrigger, but I am getting an error that it is not able to find the control that I am clicking(btnAddWidget) which is inside a RadGrid. I was wondering if there is any other way to handle this without having to re-create all the docks again. I have the flexibility to replace the RadGrid with any other control like a listview or something.
The following is my code:
Default.aspx:
function OnClientDockPositionChanged(dock, args) {
SaveState();
}
function OnClientResizeEnd(dock, args) {
SaveState();
}
function OnClientCommand(dock, args) {
SaveState();
}
function SaveState() {
var i;
var state = "";
var zone1 = $find("RadDockZone1");
var zone2 = $find("RadDockZone2");
var array1Docks = zone1.get_docks();
var array2Docks = zone2.get_docks();
for (i = 0; i < array1Docks.length; i++) {
var dock = array1Docks[i];
var dockID = dock.get_id();
var tag = $get(dockID).attributes["tag"].value;
state = state + tag + "#" + array1Docks[i].saveClientState() + "|";
}
for (i = 0; i < array2Docks.length; i++) {
var dock = array2Docks[i];
var dockID = dock.get_id();
var tag = $get(dockID).attributes["tag"].value;
state = state + tag + "#" + array2Docks[i].saveClientState() + "|";
}
SOLEWebService.VerifyUserSessionAndUpdateUserSettings(state, success, onFail);
}
function success(result) {
alert("success");
}
function onFail(result) {
alert(result.d);
}
function OnClientInitialize(dock, args) {
var dockID = dock.get_id();
var tag = $get(dockID).attributes["tag"].value;
var UserControl = $get(dockID).attributes["UserControl"].value;
if ($get(dockID).attributes["NewDock"] != null && $get(dockID).attributes["NewDock"].value != null) {
var newDock = $get(dockID).attributes["NewDock"].value;
var state = "";
state = tag + "#" + dock.saveClientState() + "|";
SOLEWebService.VerifyUserSessionAndSaveUserSettings(state, success, onFail);
}
UserControlService.GetUserWidgetData(UserControl, tag, function (result) {
$get(dockID + "_C").innerHTML = result;
});
}
<script src="/Scripts/JQuery/Scripts/JQuery-1.4.1-vsdoc.js" type="text/javascript"></script>
</head>
<body>
<form id="form1" runat="server">
<telerik:RadScriptManager runat="server" ID="RadScriptManager1" EnablePageMethods = "true" EnableScriptCombine="true">
<Services>
<asp:ServiceReference Path = "~/UserControlService.asmx" />
<asp:ServiceReference Path = "~/SOLEWebService.asmx" />
</Services>
</telerik:RadScriptManager>
<telerik:RadStyleSheetManager ID="RadStyleSheetManager1" runat="server" EnableStyleSheetCombine="true">
</telerik:RadStyleSheetManager>
<telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server" ClientEvents-OnResponseEnd = "RecallJquery">
<asp:UpdatePanel runat="server" ID="UpdatePanel1">
<ContentTemplate>
<table>
<tr>
<td>
<div id = "gridViewPanel" class = "ContainerPanel">
<div id="gridViewHeader" class="collapsePanelHeader">
<div id="Div2" class="HeaderContent">Add Stuff</div>
<div id="Div3" class="ArrowClose"></div>
</div>
<div id = "gridContent" class = "Content" style="display:none">
<telerik:RadGrid runat="server" ID="grdWidgets" OnNeedDataSource="grdWidgets_NeedDataSource"
AllowPaging="True" Width="400px" >
<MasterTableView DataKeyNames="Widgets" Width="100%" TableLayout="Fixed">
<Columns>
<telerik:GridTemplateColumn UniqueName="TemplateColumn" HeaderText="" ItemStyle-Width = "50px">
<ItemTemplate>
<asp:Panel ID="Panel1" runat="server">
<asp:LinkButton ID="btnAddWidget" runat="server" Text = "Add" OnClick = "btnAddWidget_Click" />
</asp:Panel>
</ItemTemplate>
</telerik:GridTemplateColumn>
</Columns>
</MasterTableView>
<ClientSettings AllowRowsDragDrop="True">
<Selecting AllowRowSelect="True" EnableDragToSelectRows="false" />
<Scrolling AllowScroll="true" UseStaticHeaders="true" ScrollHeight="320px" />
</ClientSettings>
<PagerStyle Mode="NumericPages" PageButtonCount="4" />
</telerik:RadGrid>
</div>
</div>
</td>
</tr>
</table>
<telerik:RadDockLayout runat="server" ID="RadDockLayout1" OnLoadDockLayout="RadDockLayout1_LoadDockLayout">
<table>
<tr>
<td style="vertical-align: top">
<telerik:RadDockZone ID="RadDockZone1" runat="server" Orientation="Vertical" Width="250px"
MinHeight="400px">
</telerik:RadDockZone>
</td>
<td style="vertical-align: top">
<telerik:RadDockZone ID="RadDockZone2" runat="server" Orientation="Vertical" Width="560px"
MinHeight="400px">
</telerik:RadDockZone>
</td>
</tr>
</table>
</telerik:RadDockLayout>
</ContentTemplate>
<%-- <Triggers>
<asp:AsyncPostBackTrigger ControlID="btnAddWidget" EventName="Click" />
</Triggers>--%>
</asp:UpdatePanel>
</telerik:RadAjaxPanel>
Code-Behind:
Protected Sub grdWidgets_NeedDataSource(ByVal source As Object, ByVal e As GridNeedDataSourceEventArgs)
grdWidgets.DataSource = PortalDataManager.GetDefaultWidgets()
End Sub
Private ReadOnly Property CurrentDockStates() As List(Of DockState)
Get
'Get saved state string from the database - set it to dockState variable for example
Dim dockStatesFromDB As String = String.Empty
dockStatesFromDB = PortalDataManager.GetUserWidgetSettings(33357)
Dim _currentDockStates As New List(Of DockState)()
If dockStatesFromDB Is Nothing Then
Return _currentDockStates
End If
If dockStatesFromDB Is String.Empty Then
Return _currentDockStates
End If
Dim stringStates As String() = dockStatesFromDB.Split("|"c)
For i As Integer = 0 To stringStates.Length - 2
Dim currentState As String() = stringStates(i).Split("#"c)
Dim uniqueName As String = currentState(0)
Dim state As String = currentState(1)
If state.Trim() <> String.Empty Then
Dim ds As DockState = DockState.Deserialize(state)
ds.Tag = uniqueName
ds.UniqueName = uniqueName
_currentDockStates.Add(ds)
End If
Next
Return _currentDockStates
End Get
End Property
Protected Sub RadDockLayout1_LoadDockLayout(ByVal sender As Object, ByVal e As DockLayoutEventArgs)
Dim states As List(Of DockState) = CurrentDockStates
For Each state As DockState In states
e.Positions(state.UniqueName) = state.DockZoneID
e.Indices(state.UniqueName) = state.Index
Next
End Sub
Private Function CreateRadDockFromState(ByVal state As DockState) As RadDock
Dim dock As New RadDock()
dock.DockMode = DockMode.Docked
dock.ID = String.Format("RadDock{0}", state.UniqueName)
dock.ApplyState(state)
SetDockProperties(dock)
AddClientEventsToDock(dock)
Return dock
End Function
Private Sub SetDockProperties(ByRef dock As RadDock)
dock.AutoPostBack = False
dock.CommandsAutoPostBack = False
dock.Commands.Add(New DockCloseCommand())
dock.Commands.Add(New DockExpandCollapseCommand())
dock.EnableEmbeddedScripts = True
dock.EnableRoundedCorners = True
dock.EnableAnimation = True
End Sub
Private Sub AddClientEventsToDock(ByRef dock As RadDock)
dock.OnClientInitialize = "OnClientInitialize"
dock.OnClientResizeEnd = "OnClientResizeEnd"
dock.OnClientDragEnd = "OnClientDragEnd"
dock.OnClientDockPositionChanged = "OnClientDockPositionChanged"
dock.OnClientCommand = "OnClientCommand"
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If (Not Page.IsPostBack) Then
Dim dockCount As Integer = CurrentDockStates.Count
For i As Integer = 0 To dockCount - 1
If CurrentDockStates(i).Closed = False Then
Dim dock As RadDock = CreateRadDockFromState(CurrentDockStates(i))
RadDockLayout1.Controls.Add(dock)
LoadUserControl(dock)
End If
Next
End If
End Sub
Protected Sub btnAddWidget_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim btnAdd As LinkButton = CType(sender, LinkButton)
Dim myPanel As Panel = CType(btnAdd.Parent, Panel)
Dim dataItem As GridDataItem = CType(myPanel.NamingContainer, GridDataItem)
Dim widgetType As String = dataItem("Widgets").Text
Dim widgetTag As String = dataItem("WidgetTag").Text
Dim userControl As String = dataItem("WidgetUserControl").Text
Dim dock As RadDock = CreateRadDock(widgetTag)
dock.Attributes("NewDock") = "True"
dock.Attributes("UserControl") = userControl
dock.Attributes("tag") = dock.Tag
RadDockZone1.Controls.Add(dock)
btnAdd.Text = "Added"
btnAdd.Enabled = False
End Sub
Private Function CreateRadDock(ByVal tag As String) As RadDock
Dim dock As New RadDock()
dock.DockMode = DockMode.Docked
dock.UniqueName = tag
dock.Tag = tag
dock.ID = String.Format("RadDock{0}", dock.UniqueName)
dock.Title = "New Dock"
SetDockProperties(dock)
AddClientEventsToDock(dock)
Dim img As New Image()
img.ImageUrl = "Reload.gif"
dock.ContentContainer.Controls.Add(img)
Return dock
End Function
Protected Sub grdWidgets_ItemCreated(ByVal sender As Object, ByVal e As Telerik.Web.UI.GridItemEventArgs) Handles grdWidgets.ItemCreated
If TypeOf e.Item Is GridDataItem Then
Dim dataItem As GridDataItem = CType(e.Item, GridDataItem)
dataItem.ToolTip = dataItem("Widgets").Text
End If
End Sub
Public Sub LoadUserControl(ByRef dock As RadDock)
If dock.Tag Is Nothing Then
Return
End If
Dim img As New Image()
img.ImageUrl = "Reload.gif"
dock.ContentContainer.Controls.Add(img)
dock.Attributes("UserID") = 33357
dock.Attributes("UserControl") = PortalDataManager.GetUserControlForWidget(dock.Tag)
dock.Attributes("tag") = dock.Tag
End Sub
Thanks so much for your time on this,
Uday.
Protected Sub grdWidgets_NeedDataSource(ByVal source As Object, ByVal e As GridNeedDataSourceEventArgs)
grdWidgets.DataSource = PortalDataManager.GetDefaultWidgets()
End Sub
Private ReadOnly Property CurrentDockStates() As List(Of DockState)
Get
'Get saved state string from the database - set it to dockState variable for example
Dim dockStatesFromDB As String = String.Empty
dockStatesFromDB = PortalDataManager.GetUserWidgetSettings(33357)
Dim _currentDockStates As New List(Of DockState)()
If dockStatesFromDB Is Nothing Then
Return _currentDockStates
End If
If dockStatesFromDB Is String.Empty Then
Return _currentDockStates
End If
Dim stringStates As String() = dockStatesFromDB.Split("|"c)
For i As Integer = 0 To stringStates.Length - 2
Dim currentState As String() = stringStates(i).Split("#"c)
Dim uniqueName As String = currentState(0)
Dim state As String = currentState(1)
If state.Trim() <> String.Empty Then
Dim ds As DockState = DockState.Deserialize(state)
ds.Tag = uniqueName
ds.UniqueName = uniqueName
_currentDockStates.Add(ds)
End If
Next
Return _currentDockStates
End Get
End Property
Protected Sub RadDockLayout1_LoadDockLayout(ByVal sender As Object, ByVal e As DockLayoutEventArgs)
Dim states As List(Of DockState) = CurrentDockStates
For Each state As DockState In states
e.Positions(state.UniqueName) = state.DockZoneID
e.Indices(state.UniqueName) = state.Index
Next
End Sub
Private Function CreateRadDockFromState(ByVal state As DockState) As RadDock
Dim dock As New RadDock()
dock.DockMode = DockMode.Docked
dock.ID = String.Format("RadDock{0}", state.UniqueName)
dock.ApplyState(state)
SetDockProperties(dock)
AddClientEventsToDock(dock)
Return dock
End Function
Private Sub SetDockProperties(ByRef dock As RadDock)
dock.AutoPostBack = False
dock.CommandsAutoPostBack = False
dock.Commands.Add(New DockCloseCommand())
dock.Commands.Add(New DockExpandCollapseCommand())
dock.EnableEmbeddedScripts = True
dock.EnableRoundedCorners = True
dock.EnableAnimation = True
End Sub
Private Sub AddClientEventsToDock(ByRef dock As RadDock)
dock.OnClientInitialize = "OnClientInitialize"
dock.OnClientResizeEnd = "OnClientResizeEnd"
dock.OnClientDragEnd = "OnClientDragEnd"
dock.OnClientDockPositionChanged = "OnClientDockPositionChanged"
dock.OnClientCommand = "OnClientCommand"
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If (Not Page.IsPostBack) Then
Dim dockCount As Integer = CurrentDockStates.Count
For i As Integer = 0 To dockCount - 1
If CurrentDockStates(i).Closed = False Then
Dim dock As RadDock = CreateRadDockFromState(CurrentDockStates(i))
RadDockLayout1.Controls.Add(dock)
LoadUserControl(dock)
End If
Next
End If
End Sub
Protected Sub btnAddWidget_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim btnAdd As LinkButton = CType(sender, LinkButton)
Dim myPanel As Panel = CType(btnAdd.Parent, Panel)
Dim dataItem As GridDataItem = CType(myPanel.NamingContainer, GridDataItem)
Dim widgetType As String = dataItem("Widgets").Text
Dim widgetTag As String = dataItem("WidgetTag").Text
Dim userControl As String = dataItem("WidgetUserControl").Text
Dim dock As RadDock = CreateRadDock(widgetTag)
dock.Attributes("NewDock") = "True"
dock.Attributes("UserControl") = userControl
dock.Attributes("tag") = dock.Tag
RadDockZone1.Controls.Add(dock)
btnAdd.Text = "Added"
btnAdd.Enabled = False
End Sub
Private Function CreateRadDock(ByVal tag As String) As RadDock
Dim dock As New RadDock()
dock.DockMode = DockMode.Docked
dock.UniqueName = tag
dock.Tag = tag
dock.ID = String.Format("RadDock{0}", dock.UniqueName)
dock.Title = "New Dock"
SetDockProperties(dock)
AddClientEventsToDock(dock)
Dim img As New Image()
img.ImageUrl = "Reload.gif"
dock.ContentContainer.Controls.Add(img)
Return dock
End Function
Protected Sub grdWidgets_ItemCreated(ByVal sender As Object, ByVal e As Telerik.Web.UI.GridItemEventArgs) Handles grdWidgets.ItemCreated
If TypeOf e.Item Is GridDataItem Then
Dim dataItem As GridDataItem = CType(e.Item, GridDataItem)
dataItem.ToolTip = dataItem("Widgets").Text
End If
End Sub
Public Sub LoadUserControl(ByRef dock As RadDock)
If dock.Tag Is Nothing Then
Return
End If
Dim img As New Image()
img.ImageUrl = "Reload.gif"
dock.ContentContainer.Controls.Add(img)
dock.Attributes("UserID") = 33357
dock.Attributes("UserControl") = PortalDataManager.GetUserControlForWidget(dock.Tag)
dock.Attributes("tag") = dock.Tag
End Sub
Thanks so much for your time on this,
Uday.