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

OnDemand load nodes with HierarchicalDataSource

13 Answers 190 Views
TreeView
This is a migrated thread and some comments may be shown as answers.
Dédé
Top achievements
Rank 1
Dédé asked on 21 Jul 2009, 02:07 PM
Hi,

With my problem of CommandButton in node loaded serverside with a callback, I had to code a HierarchicalDataSource.

But the problem is that page load time is very long since the treeview loads all nodes. I have about 10000 nodes, it take 5s to load (localhost) but long long time to execute javascript onload codes. Maybe caused by RadFormDecorator...

Anyway, is there a way to improve RadTreeView working with HierarchicalDataSource to have nodes populated on-demand, with serverside callbacks, and with rendered template controls persistance for event handling ?
It can let users add their own UserControls to a node, thus allowing non-common usages of a treeview...

Thanks.

13 Answers, 1 is accepted

Sort by
0
Mr. Plinko
Top achievements
Rank 1
answered on 21 Jul 2009, 03:12 PM
I am not sure if you've already checked the documentation, but there is a tutorial on Server-Side Load On Demand here:
http://www.telerik.com/help/aspnet-ajax/tree_databindingloadondemandserver.html

There is also a demo of the on-demand load types here:
http://demos.telerik.com/aspnet-ajax/treeview/examples/programming/loadondemandmodes/defaultcs.aspx

I'm not sure how this would interact with a Hierarchical DataSource, but hopefully it is helpful.
0
Dédé
Top achievements
Rank 1
answered on 21 Jul 2009, 03:36 PM
Hi Mr. Plinko,

It can't work.

The sample uses serverside callbacks generated by the treeview, without a declarative datasource (property DataSourceId). All is done in codebehind, by doing yourself database request acording to expanding node.

You could tell me : "you can use your HierarchicalDataSource to achieve this" but it will fall back to the problem I have here.

I think the RadTreeView has to be improved to handle declarative datasource with a "populate on-demand" behavior.
And to handle the problem of programmatically added controls to node, to recreate serverside all expanded nodes to let application handle events correctly.

Thanks.
0
Mr. Plinko
Top achievements
Rank 1
answered on 21 Jul 2009, 04:39 PM
Sounds like something you should create a support ticket for! If they ultimately can't solve your problem, it might give Telerik some ideas for one of their future releases.
0
Dédé
Top achievements
Rank 1
answered on 21 Jul 2009, 05:01 PM
Before creating a support ticket, I am going to wait for the team answer, if I have to open ticket, or if there is an easy workaround.

Thanks.
0
Atanas Korchev
Telerik team
answered on 22 Jul 2009, 08:00 AM
Hello Damien,

Currently RadTreeView supports load on demand only bu implementing the NodeExpand event or by using WebService or PageMethods mode.

Also RadTreeView does not automatically recreate after postback any custom controls added in the node's controlls collection. It behaves exactly as the Panel or Placeholder controls - all dynamically added controls must be readded after postback by the developer.

Regards,
Albert
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
Dédé
Top achievements
Rank 1
answered on 22 Jul 2009, 08:13 AM
Hi Albert,

I think that RadTreeView  should implement an on-demand loading mode for hierarchical datasource, so it will avoid loading all the items into client : my tree has about 10 000 nodes, it takes about 10min on a good machine under IE8 after first load to have browser not freezing (I think this is due to RadFormDecorator).

Loading on demande using page methods can be used too, but how can I recreate controls tree ? Is there a way to configure treeview to retrigger all "node expand" events, thus allowing to recreate all dynamics controls ? I think it should not be too hard to code.

Thanks.
0
Accepted
Atanas Korchev
Telerik team
answered on 22 Jul 2009, 08:29 AM
Hi Damien,

Actually there is a way to populate nodes on demand from hierarchical datasource. However you should make sure the ExpandMode property of the parent nodes is not ClientSide (which is the default). Here is an example:

    <telerik:RadTreeView runat="server" ID="RadTreeView1" DataSourceID="XmlDataSource1" DataTextField="Text">
        <DataBindings>
            <telerik:RadTreeNodeBinding Depth="0" ExpandMode="ServerSideCallBack" />
        </DataBindings>
    </telerik:RadTreeView>
    <asp:XmlDataSource runat="server" ID="XmlDataSource1" XPath="/Root/Node">
        <Data>
                <Root>
                    <Node Text="Root">
                        <Node Text="Child"></Node>
                    </Node>
                </Root>
        </Data>
    </asp:XmlDataSource>

However if you want to use custom controls which fire events you must use ExpandMode="ServerSide". You can wrap the treeview inside RadAjaxPanel to avoid the postback. Custom controls can be instantiated during the NodeCreated event which should fire after postback for all nodes in the treeview.

Regards,
Albert
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
Dédé
Top achievements
Rank 1
answered on 22 Jul 2009, 08:57 AM
Hi Albert,

Your idea seems to work well, but I think there may be performance issues :
  • it seams that when loaded the first time, all data is loaded from datasource, but only root nodes are sent to client
  • when expanding a root node, all children are loaded in one time, and sent to client, so ServerSideCallback is not applied. (the effect of the Depth property)
Is there a way to improve performances by only asking datasource for visible nodes ? This would avoid loading all my 10000 items from database to server memory...
When I was searching for doc about the "Depth" property, I have found http://www.telerik.com/help/aspnet/treeview/radtreeview-telerik.webcontrols.radtreenodebinding-depth.html, but it seams that in "Remarks" there is an error : RadMenuItemBinding instead of RadTreeNodeBinding (just a too fast copy/past I think).

Is there a way to apply the RadTreeNodeBinding based on data value instead on Depth ? Since the lowest depth of node that can be expanded is not the same, I would like not to set last child nodes expand mode to serversidecallback...

Thanks.
0
Atanas Korchev
Telerik team
answered on 22 Jul 2009, 01:03 PM
Hi Damien,

Up to your questions:

Indeed all nodes are loaded when using databinding. For the time being it is not possible to perform codeless load on demand from hierarchical datasource. Currently the only thing we do is not to render everything as this is the biggest performance hit.

Unfortunately the Depth is the only way to specify a binding. You can however use the NodeDataBound event and set the required node properties based on the underlying data item.

We will fix the documentation problem. Thanks for reporting it.

Regards,
Albert
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
Dédé
Top achievements
Rank 1
answered on 22 Jul 2009, 02:02 PM
Hi,

Is there a way to load only needed nodes (visible nodes) on databinding, avoiding this performance overload ?
Today, it takes me about 10s to load 10000 items from DbServer to my dev server...

Do you think it is possible ?

Thanks.
0
Atanas Korchev
Telerik team
answered on 22 Jul 2009, 02:08 PM
Hi Damien,

Unfortunately this is not possible using a hierarchical datasource. You have to use the NodeExpand event , request the required data and populated the child nodes from the returned results.

Regards,
Albert
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
Dédé
Top achievements
Rank 1
answered on 22 Jul 2009, 02:18 PM
Hi,

Ok, but if I use the NodeExpand event, the dynamic controls I may add to nodes are created only the first time the node is created... So I fall back to original problem... Maybe you could add a "NodeCreateControls" event in which I can recreate custom controls inside node (from node value) so events that these controls have their viewstate properly restored, and events triggered ?

Thanks.
0
Atanas Korchev
Telerik team
answered on 22 Jul 2009, 02:37 PM
Hello Damien,

The NodeCreated event should be the appropriate place do instantiate dynamic controls. Have you tried that? Let me know if you experience any problems with that event. I will try to assemble a sample project.

Regards,
Albert
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.
Tags
TreeView
Asked by
Dédé
Top achievements
Rank 1
Answers by
Mr. Plinko
Top achievements
Rank 1
Dédé
Top achievements
Rank 1
Atanas Korchev
Telerik team
Share this question
or