locked
Treeview Navigation BETA3 RRS feed

  • Question

  • User632418284 posted

    Now this may seem like a very simple question and I'm hoping that is just me being thick but....

    I have tried to update my website from version 1.0 of the adapters to 3.0 as I want to take advantage of the treeview improvements (namely viewstate).  I have got one treeview that is placed on the sites masterpage so it should be fairly easy to implement this but I'm having problems with is what to put in the OnTreeSelection Event.  All my treeview is for is for navigation, no use of AJAX is needed so all I need to do is navigate to the url indicated in the sitemap that is attached to the treeview control.[:D]

    Can anyone help?

    Friday, November 3, 2006 10:10 AM

All replies

  • User-534056067 posted

    Hi Mark,

    I'll be happy to try to help but I need to understand the situation a little better.

    It seems like you are saying that you have a master page that has an <asp:TreeView> that is bound to a <asp:SiteMapDataSource>.  In your sitemap you have siteMapNode elements that each have a unique url value.  In that case, the tree should render with simple links that help you navigate from page to page.

    It doesn't seem like you need to handle selection events, etc.  The navigation should simply work.

    I'm guessing that the real issue is that you want the tree to expand automatically to some node, perhaps the node corresponding to the current page.  Is that right?  If so, I can suggest some techniques that you can use.

    The view state enhancements only pertain to situation where a page posts back to itself.  It doesn't pertain to navigating between different pages (i.e., it only pertains to HTTP POST, not HTTP GET).  The tree can't re-expand to its old state if you move between pages because that expansion info exists in the posted info (when the page posts back to itself).  Without that posted info there is no expansion map to reexpand to.

    Clear as mud?

    Friday, November 3, 2006 3:16 PM
  • User-138510437 posted

    Your guess was correct.  People have noted that it is somewhat annoying that when they use the treeview to navigate to another page it collapses back down again.  Can we not store the details in the session variable and then re-expand it again?  Because the treeview is on the masterpage and its relative position on the page doesn't change, it makes matters worse as it looks like it should stay expanded.

    Thanks for your help by the way! 

    Saturday, November 4, 2006 10:10 AM
  • User-534056067 posted

    Session persistence isn't something we can use because it completely fails in situations where you deploy the site to a web farm.  In those situations you can overcome the Session problem by using a database for your session store (you end up writing your own session store provider class) but that isn't something we can do in this kit.

    Let's see if there is a simpler way to handle this problem.

    I know that it is easiest if it is handled automatically in the kit but in this case it may be necessary for you to do some extra coding in your own pages to make this work the way you want.  Let me explain.  I bet you find that it isn't too hard to do.

    First, in your <asp:treeview> you need to add the OnTreeNodeDataBound attribute.  Set this to the name of a method that you will add to your code behind (on whatever page or master page contains the tree).  In your event handler method for OnTreeNodeDataBound you will be passed an argument that has a reference to the current tree node that was just bound to its data.  Take a look at http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.treenodeeventargs(VS.80).aspx.  You can compare e.Node.NavigateUrl with the current url of the page you are on by doing something like this:

    if (Request.Url.PathAndQuery == e.Node.NavigateUrl)
    {
        e.Node.Selected = true;
    }

    Basically, you are setting the Selected property to true on the tree node that corresponds to the current page.

    Then, you need to expand the tree so that the selected tree node is showing.  To do that, use a method like this:

    private void ExpandToNode(TreeView treeView, TreeNode item)
    {
        if ((treeView != null) && (item != null))
        {
            treeView.CollapseAll();
            TreeNode nodeToExpand = item.Parent;
            while (nodeToExpand != null)
            {
                nodeToExpand.Expanded = true;
                nodeToExpand = nodeToExpand.Parent;
            }
        }
    }

    And call it from your page (or master page) PreRender event (Page_PreRender) like this:

    ExpandToNode(mytree, mytree.SelectedNode);

    I've done this in the past so I know this implementation pattern works.  However, I've not tested the code I've posted here so it might need to be tweaked slightly.  Still, I bet it gives you the right idea.

    The tree will expand to the selected node which will correspond to the current page.  The tree will not retain its overall expansion state so you may see some of the parts of the tree collapse when you switch pages.  Still, this solution looks pretty attractive when I use it.  I hope you find that it is an acceptable solution to your situation, too.

    Best regards,

    Saturday, November 4, 2006 10:35 AM
  • User632418284 posted

    Would it be possible to pass all the expanded nodes (as a string array) in a url query string so that we could attempt to persist session state that way?  Thought it might be possible to catch the parameters in the masterpages page_Load event and then expand the tree that way??

     Does this seem do-able

    Tuesday, November 7, 2006 10:31 AM
  • User632418284 posted

    Would it be possible to pass all the expanded nodes (as a string array) in a url query string so that we could attempt to persist session state that way?  Thought it might be possible to catch the parameters in the masterpages page_Load event and then expand the tree that way??

     Does this seem do-able?

    Tuesday, November 7, 2006 10:32 AM
  • User-534056067 posted
    Brendan Rice has done some very nice work to modify TreeViewAdapter.js so it preserves the tree's expansion state in a cookie.  He's trying to solve a problem similar to what you are looking at.  Check this out, http://forums.asp.net/thread/1453605.aspx.
    Friday, November 10, 2006 9:06 AM
  • User1390297269 posted

    Hi

    I have one TreeView in a Master Page.Now when i'm navigating to child pages that time the master page is not able to hold to treeview session. I tried with the event "OnDataBinding" and "SelectedNodeChanged" but it is not firing those events.

    so i tried with your code but in <asp:treeview> i'm not geting any event like "OnTreeNodeDataBound"

    where i need to put the piece written below:

    private void ExpandToNode(TreeView treeView, TreeNode item)
    {
        if ((treeView != null) && (item != null))
        {
            treeView.CollapseAll();
            TreeNode nodeToExpand = item.Parent;
            while (nodeToExpand != null)
            {
                nodeToExpand.Expanded = true;
                nodeToExpand = nodeToExpand.Parent;
            }
        }
    }

     

     

    Thanks & Regards,

    Satyajit Roy

    Monday, September 3, 2007 10:19 AM