This is a migrated thread and some comments may be shown as answers.

NestedViewTemplate DataBinding

8 Answers 268 Views
Grid
This is a migrated thread and some comments may be shown as answers.
Robert
Top achievements
Rank 1
Robert asked on 08 Jul 2009, 08:14 PM
I have a NestedViewTemplate which will contain several labels and another RadGrid. Because it's expensive to get the data for the labels and nested grid, I'd like to do this only when the NestedViewTemplate is visible.

I set the HierarchyLoadMode to ServerOnDemand and registered for the ItemDataBoundEvent. In the ItemDataBound event, I check the ItemType, and if it's NestedView, I do my expensive data lookups and bind to the labels/grid.

This works great, except that the NestedView items are being databound not when I expand the item in the grid, but instead when the grid is initially databound.

What am I doing wrong?

8 Answers, 1 is accepted

Sort by
0
Tsvetoslav
Telerik team
answered on 10 Jul 2009, 01:04 PM
Hello Robert,

Indeed, you are correct in observing this behavior  - RadGrid does not support ServerOnDemand binding with NestedViewTemplate. When the ServerOnDemand mode is specified, then the main grid table reconstructs its items from the ViewState which means that the expanded item won't be databound. If the parent item is not databound, it follows that the nested view template related to it cannot be databound. For this reason, RadGrid always binds all of its nested view items on initial load except for the case demonstrated in the following online example: NestedViewTemplate Relations.

I hope this helps.

Best Regards,
Tsvetoslav
the Telerik team

Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
0
Robert
Top achievements
Rank 1
answered on 10 Jul 2009, 02:27 PM
If I wanted on-demand loading, how would I achieve this?
0
Sebastian
Telerik team
answered on 10 Jul 2009, 02:44 PM
Hello Robert,

Review the approach with NestedView template relations presented in the demo and modify your logic accordingly to take advantage of it and have load-on-demand mode for the expanded records. Otherwise consider the technique with dynamic panel visibility changing presented on this online demo of the product.

Greetings,
Sebastian
the Telerik team

Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
0
Jack Voss
Top achievements
Rank 1
answered on 03 May 2011, 09:36 PM
Hello,

I'm using the method  "dynamic panel visibility changing presented on this online demo" as presented above.  The datasources are bound in the code behind page using the OnNeedDataSource event.  The problem I have is that OnNeedDataSource for the nested sub grids are not being fired until the Master grid is expanded once and then collapsed.

So if the user expands the grid, then collapses it, then expands it again, we can see the grid with the data.  Nothing happens on the first expansion of the grid.

At this point I'm not really sure what to do, so any adivce would be appreciated. 

Thank you
0
Tsvetina
Telerik team
answered on 04 May 2011, 12:23 PM
Hello Jack,

When you use NeedDataSource to populate the nested grid, you might need to call rebind for it after it has been made visible. In other words, try calling Rebind() for the nested grid after you have set the panel's Visible property to true.

This happens because when the grid is not initially visible, it does not bind automatically:
http://www.telerik.com/help/aspnet-ajax/grid-visible-invisible-conventions.html

Greetings,
Tsvetina
the Telerik team

Browse the vast support resources we have to jump start your development with RadControls for ASP.NET AJAX. See how to integrate our AJAX controls seamlessly in SharePoint 2007/2010 visiting our common SharePoint portal.

0
Jack Voss
Top achievements
Rank 1
answered on 04 May 2011, 02:22 PM
Thank you,  I thought that might be the case.

I wound up implementing this :
protected void grdCMT_ItemCommand(object source, GridCommandEventArgs e)
        {
            if (e.CommandName == RadGrid.ExpandCollapseCommandName && e.Item is GridDataItem && !e.Item.Expanded)
            {
                RadAjaxPanel rpInnerPanel1;
                rpInnerPanel1 = (RadAjaxPanel)((GridDataItem)e.Item).ChildItem.FindControl("InnerPanel1");
                //RadAjaxPanel rpInnerPanel1 = (RadAjaxPanel)(e.Item.FindControl("InnerPanel1"));
                rpInnerPanel1.Visible = true;
                RadMultiPage rmMultiPage1 = (RadMultiPage)(rpInnerPanel1.FindControl("RadMultiPage1"));
                RadPageView rpvInstalls = (RadPageView)(rmMultiPage1.FindControl("rpvInstalls"));
                RadGrid rgInstalls = (RadGrid)(rpvInstalls.FindControl("rgrdInstalls"));
                rgInstalls.Rebind();
            }
            else if (e.CommandName == RadGrid.ExpandCollapseCommandName && e.Item is GridDataItem && e.Item.Expanded)
            {
                RadAjaxPanel rpInnerPanel1;
                rpInnerPanel1 = (RadAjaxPanel)((GridDataItem)e.Item).ChildItem.FindControl("InnerPanel1");
                rpInnerPanel1.Visible = false;
            }
        }

It seems to work fine now,  I'm not sure if I needed to search through the child controls like that, but it works right now.

Thank you
0
Sridharan
Top achievements
Rank 1
answered on 26 Jul 2014, 06:15 PM
I tried to control the on demand loading of radgrid inside nestedviewtemplate based on the code snippets in the demo. But the data binding still happens for radgrids inside the nestedviewtemplate along with master grid data.

Here is my snippets of aspx
......
<telerik:RadAjaxPanel ID="RadAjaxPanel1" runat="server" >
<telerik:RadGrid ID="MasterGrid" datasourceid="master_table_ds" runat="server"
AllowFilteringByColumn="True" AllowSorting="True" ClientSettings-ReorderColumnsOnClient="True"
AllowPaging="True" PageSize="2" MasterTableView-AllowCustomSorting="True" AllowAutomaticUpdates="True"
OnColumnCreated="RadGrid_ColumnCreated" OnItemDataBound="MasterGrid_ItemDataBound">

<GroupingSettings CaseSensitive="false" />

<MasterTableView DataKeyNames="ProjectID" EnableHeaderContextMenu="true"
AutoGenerateColumns="false" HierarchyLoadMode="ServerOnDemand" ShowHeadersWhenNoRecords="false">

...
...
<Columns>
...
..
</Columns>
..
<NestedViewTemplate>
<asp:Panel ID="ProjectDetailsContainer" CssClass="viewWrap" Visible="false" runat="server">

<div class="bgg-white-darkslategray" style="padding-left:10px; padding-top:8px; width:100%; overflow:auto;">
..
..
<telerik:RadTabStrip runat="server" ID="Tabstrip" MultiPageID="tabPages" SelectedIndex="0">
<Tabs>
<telerik:RadTab Text="Project Info" PageViewID="PageView1" runat="server" >
</telerik:RadTab>

<telerik:RadTab Text="Roles" PageViewID="PageView2" runat="server">
</telerik:RadTab>


 </Tabs>
</telerik:RadTabStrip>


<telerik:RadMultiPage runat="server" ID="tabPages" SelectedIndex="0" RenderSelectedPageOnly="false">
 
 
<telerik:RadPageView ID="PageView1" runat="server" >
<asp:Label ID="projectIDLabel1" Font-Bold="true" Font-Italic="true" Text='<%# Eval("ProjectID") %>'
Visible="false" runat="server">
</asp:Label>
<telerik:RadGrid ID="ProjRecordDetailGrid" DataSourceID="detail_table1_ds" runat="server"  >
..
..


<asp:ObjectDataSource ID="detail_table1_ds" SelectMethod="GetGridData" EnableCaching="true"
OnSelecting="detail_table_ds_Selecting"  TypeName="dataSourceObject" CacheDuration="10" runat="server" >
<SelectParameters>
<asp:ControlParameter ControlID="projectIDLabel1" Name="ProjectID" Type="String" Direction="Input" />
  <asp:Parameter Name="datasource" DefaultValue="ProjectsForm" />
</SelectParameters>
</asp:ObjectDataSource>
 ..
</telerik:RadPageView>
</telerik:RadMultiPage>

</div>
</asp:Panel>
</NestedViewTemplate>

 </MasterTableView>
 
</telerik:RadGrid>
</telerik:RadAjaxPanel>
</div>

-------------------------------------

Code behind logic is similar to the one in demo

Protected Sub MasterGrid_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles MasterGrid.PreRender

If Not Page.IsPostBack Then

MasterGrid.MasterTableView.Items(0).Expanded = True

MasterGrid.MasterTableView.Items(0).ChildItem.FindControl("ProjectDetailsContainer").Visible = True

End If

End Sub



Protected Sub MasterGrid_ItemCommand(ByVal source As Object, ByVal e As GridCommandEventArgs) Handles MasterGrid.ItemCommand

If e.CommandName = RadGrid.ExpandCollapseCommandName And TypeOf e.Item Is GridDataItem Then

DirectCast(e.Item, GridDataItem).ChildItem.FindControl("ProjectDetailsContainer").Visible = Not e.Item.Expanded

End If

End Sub



Protected Sub MasterGrid_ItemCreated(ByVal sender As Object, ByVal e As GridItemEventArgs) Handles MasterGrid.ItemCreated

If TypeOf e.Item Is GridNestedViewItem Then
 
e.Item.FindControl("ProjectDetailsContainer").Visible = (DirectCast(e.Item, GridNestedViewItem)).ParentItem.Expanded


End If

End Sub

===================================

Please advise if I am missing anything or doing anything incorrectly.

thanks in advance,
Sri

 

 
0
Eyup
Telerik team
answered on 30 Jul 2014, 10:32 AM
Hello Sridharan,

I'm sending a sample RadGrid web site to demonstrate optimal configuration of nested grid bindings. Please run the attached application and let me know if it helps you.

Regards,
Eyup
Telerik
 

Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.

 
Tags
Grid
Asked by
Robert
Top achievements
Rank 1
Answers by
Tsvetoslav
Telerik team
Robert
Top achievements
Rank 1
Sebastian
Telerik team
Jack Voss
Top achievements
Rank 1
Tsvetina
Telerik team
Sridharan
Top achievements
Rank 1
Eyup
Telerik team
Share this question
or