Sunday, March 6, 2011

How do you databind to a System.Windows.Forms.Treeview control?

I'm looking at this control, and it seems to be lacking the standard .net "datasource" and "datamember" properties for databinding. Is this control not bindable? I can write some custom function that populates the treeview from a given data source, I suppose, and embed data objects as necessary, but is that the 'best practice'? Or does everyone simply use a 3rd party treeview control?

From stackoverflow
  • You are correct in that there is no data binding. The reason being is that TreeViews are hierarchical data structures. That is, not a straight list. As a result the databind option is invalid to say a List structure.

    Sadly it's creating your own populate methods or buying 3rd party controls (which in the end will have their own populate methods.)

    Here's a decent MSDN article on Binding Hierarchical Data.

  • If it's only a couple levels, I like to populate a dataset with a couple tables and set up a DataRelation on the columns. Then you use some nested loops and create your tree nodes.

  • I use the tree control from Developer's Express. It will take a table of data and display/edit it in a hierarchical fashion. All it needs is a primary key field and a parent id field in the table and it can figure out what goes where.

    You can do the same thing if you roll your own code and use your own class.

      class Node
      {
        System.Collections.Generic.List<Node> _Children;
        String Description;
    
        void Node()
        {
          _Children = new System.Collections.Generic.List<Node>();
        }
    
        public System.Collections.Generic.List<Node> Children()
        {
          return (_Children);
        }
      }
    
      class Program
      {
        static void Main(string[] args)
        {
          System.Collections.Generic.List<Node> myTree = new System.Collections.Generic.List<Node>();
          Node firstNode = new Node();
          Node childNode = new Node();
          firstNode.Children().Add(childNode);
        }
      }
    

0 comments:

Post a Comment