Solved

Dynamic treeview node manipulation problem (and dynamic controls in general)

Posted on 2004-08-17
10
252 Views
Last Modified: 2012-05-05
i'd like to ask a side question about dynamic controls. I create a table and a bunch of controls locally in my own class (CBControlsSimple), and Add them to the Controls collection of panels on the main page

protected CBControlsSimple cbCont;
protected System.Web.UI.WebControls.Panel cbPanel;
protected System.Web.UI.WebControls.Panel zyPanel;

private void Page_Load(object sender, System.EventArgs e)
{
     if (!IsPostBack || Session.IsNewSession)
     {
          // create control sets
          cbCont = new CBControlsSimple(cbPanel,zyPanel);
          Session["CBCONT"] = cbCont;
     }
     else
     {
          cbCont = (CBControlsSimple)Session["CBCONT"];
          cbCont.ReconnectToPanel(cbPanel,zyPanel);
     }
     this.SmartNavigation = true;
}

And the CBControlsSimple::Reconnect function

     // Reconnect table to panel, for page reload
     public void ReconnectToPanel(Panel cbpan, Panel zypan)
     {
          HttpContext.Current.Response.Write("Reconnect controls to panel<br>");
          cbPanel = cbpan;
          cbPanel.Controls.Add(cbTable);
          zyCont.ReconnectToPanel(zypan); // yet another of my internal controls classes
     }

My question is this: I persist these objects by storing them in Session as you can see from my Page_Load(), specifically not creating the controls every time the page is loaded. But I am noticing strange behavior, such as when I try to add a TreeNode to my treeView (I add and remove nodes dynamically) I get an error stating

Attempted to add a TreeNode to a second TreeNodeCollection. A TreeNode can belong to only one TreeNodeCollection. Remove the TreeNode from its old collection before adding it to a new one.

What is going on!?
0
Comment
Question by:RichardFox
  • 4
  • 3
  • 3
10 Comments
 

Author Comment

by:RichardFox
ID: 11824743
Here is my treenode update code:

public void DisplayNode(string company_key)
{
// note: nodes are stored in a hash table. key is company name from list box

      if (compHash.Contains(company_key))
      {
            // node found
            found = (TreeNode)compHash[company_key];
            docTree.Nodes.Clear();
            docTree.Nodes.Add(found); // my treeview
      }
      else
      {
            docTree.Nodes.Clear();
      }
}
0
 
LVL 8

Accepted Solution

by:
trevorhartman earned 500 total points
ID: 11824810
do you know which line it gives an error on?

couple things i might try:
add a clone of the node:

docTree.Nodes.Add((TreeNode)found.Clone()); // my treeview

and see what happens.
also try using the insert method instead of add

docTree.Nodes.Insert(0, found);
0
 
LVL 8

Expert Comment

by:shovavnik
ID: 11824868
I'm not sure about this, but I think you need to actually remove the nodes from their original tree.  The original tree for each is accessible from withing the node itself.  Try something like this:

TreeNode found = (TreeNode)compHash[company_key];
TreeNode node = found.OwnerTree.Remove( found );

This is just a general direction.  I can't recall the name of the owner tree property right now.
This problem is analogous to moving XmlNodes between different XmlDocuments.  They need to be imported from one to the other and cannot simply be "moved" over.

Sorry I can't offer any more suggestions.
0
Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

 
LVL 8

Expert Comment

by:shovavnik
ID: 11824876
Hey, trevorhartman's suggestion to Clone the node is probably a much better and simpler solution.  I should have thought of that :)
0
 
LVL 8

Expert Comment

by:trevorhartman
ID: 11824893
Yes, that's a good idea.  TreeView is the property to get the owner tree:

TreeNode found = (TreeNode)compHash[company_key];
TreeNode node = found.TreeView.Nodes.Remove( found );
0
 

Author Comment

by:RichardFox
ID: 11825164
Hmm. THere is no TreeView property in my TreeNode, there is a TreeBase.parent property but it exposes a very limited number of properties itself, Nodes is not included.

I am using Microsoft.Web.UI.WebControls.TreeView docTree, not the generic treeview.

Clone() works, though, except aren't I then leaving a lot of dangling references of TreeNodes to TreeViews?
0
 
LVL 8

Expert Comment

by:trevorhartman
ID: 11825240
ok, i was looking at the System.Windows.Forms.TreeNode documentation...

It shouldn't leave references if you are just pulling the nodes out of a HashTable
0
 

Author Comment

by:RichardFox
ID: 11825320
I was thinking of the cloned nodes that I add to the docTree, and later remove. But I guess when I remove them they are gone, unless the framework keeps them on the heap somewhere. Which was my point. I just don't want to leave those cloned nodes floating out there. So you don't think it's a problem?
0
 
LVL 8

Expert Comment

by:trevorhartman
ID: 11825340
I don't see it as a problem, but test it out to see if it has any affect on the performance of your app.
0
 
LVL 8

Expert Comment

by:shovavnik
ID: 11839093
It doesn't keep them anywhere.  It has pretty smart garbage collection.
0

Featured Post

Free Tool: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

One of the pain points with developing AJAX, JavaScript, JQuery, and other client-side behaviors is that JavaScript doesn’t allow for cross domain request for pulling content. For example, JavaScript code on www.johnchapman.name could not pull conte…
User art_snob (http://www.experts-exchange.com/M_6114203.html) encountered strange behavior of Android Web browser on his Mobile Web site. It took a while to find the true cause. It happens so, that the Android Web browser (at least up to OS ver. 2.…
Established in 1997, Technology Architects has become one of the most reputable technology solutions companies in the country. TA have been providing businesses with cost effective state-of-the-art solutions and unparalleled service that is designed…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

808 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question