|
Rank: Advanced Member Groups: Member
Joined: 6/14/2007 Posts: 36
|
Hi There,
I am trying to use a treeview with the PopulateOnDemand functionality.
When I post back my page, my broken out tree is lost, I am assuming because the newly populated nodes are not retained in the viewstate.
Is there any way around this? If not, my only approach would be to somehow keep track of which nodes were expanded, and use this information during postback to rebuild the tree appropriately.
Probably, for efficiency, I'd only be able to break out the tree to the selected node, and leave all other nodes contracted.
Can you offer any other suggestions?
Regards, David
|
|
Rank: Administration Groups: Administration
Joined: 5/27/2007 Posts: 24,194
|
Hi David,
Thanks for posting your question here. You are correct. Nodes populated on demand are not retained in the ViewState. The reason is because PopulateOnDemand are usually used with very large tree and using view state with very large tree is not recommended as it poses serious performance problem.
What you suggested ---- keeping a list of expanded node, not all the nodes populated on demand, seems to be the best way. Usually you would keep the path of the node. Once you are back to the server with the node list, you can "reply" the populating process by calling your PopulateOnDemand handler on them.
If you are not in a hurry, we will also look into the details and see if we can implement this on our side. It's probably easier to do it on our side because we have more access to the internal works of our controls.
Thanks
|
|
Rank: Advanced Member Groups: Member
Joined: 6/14/2007 Posts: 36
|
Hi There,
Thanks for the info. :)
For now, I may have to build a simple workaround myself. We are creating a control which "wraps" the tree so that we can easily configure it using an XML structure. On postback of a "populate on demand" tree, I may need to remember what was broken out.
The good thing is, if you do implement this in future, I can go back and simplify/improve the code. :)
Thanks, David
|
|
Rank: Advanced Member Groups: Member
Joined: 6/14/2007 Posts: 36
|
I'm back again with another question :)
...
When the PopulateOnDemand event is fired, my Page Load event is fired first, before the PopulateOnDemand event handle (as expected).
Is there any easy way of tracking what exactly submitted the form, so that I can handle in my Page Load appropriately?
For other controls in the past, I have been able to use Request.Form("__EVENTTARGET"), which gives me the control ID of the control that just posted back the form. However, in this case I cannot use this.
The reason I wanted to know is that I would like to be able to not run certain pieces of code in my Page Load event when the populate on demand event is fired.
(I am using ASP AJAX, so am interested in partial page updates where possible)
Can you please advise?
Thanks in advance.
David
|
|
Rank: Administration Groups: Administration
Joined: 5/27/2007 Posts: 24,194
|
Hi David,
Internally we use our own Callback to do populate on demand. So you can do:
1. Drop a Callback control onto your form, say the ID is Callback1; 2. In Page_Load, use if (Callback1.IsCallback) to determine whether the page is loaded by our TreeView;
Of course IsCallback returns true for any callbacks initialized by our controls. So you need to watch out on that. In the future we probably should add a property on the TreeView that tells you whether it is doing populating on demand.
Thanks
|
|
Rank: Advanced Member Groups: Member
Joined: 6/14/2007 Posts: 36
|
Hi,
Thanks for the help. I have tried this and can track the tree populate on demand in this way.
One side effect is that I cannot appear to update an ASP AJAX UpdatePanel on such a callback. This may be by design of ASP AJAX, I am not sure.
This does not appear to be vital for what I am working on, since when populate on demand is called, then nothing else should be called on my page. I just set up an UpdatePanel to test.
So I think I'm good for now, just thought you'd like to know my results. :)
Thanks again, David
|
|
Rank: Administration Groups: Administration
Joined: 5/27/2007 Posts: 24,194
|
David,
Thanks for the update. And it's true, you can not update an ASP AJAX UpdatePanel this way. I believe ASP AJAX UpdatePanel only updates when the call originates from itself, which makes sense.
Thanks
|
|