How to build an ASP.NET TreeView From Scratch…?

2019-08-03 03:35发布

问题:

I am trying to build a nested/threaded comment system in ASP.NET. I don't know how the PHP guys do it. Its much harder than first imagined.

I am trying my damnedest get Hierarchical data to output to the user, but its not working.

I have a table with text, a itemID and a parentID.

I want to display the information in a tree view format, but asp.net's standard control just doesn't work...

Can anyone point me in the right direction of how to output this into a treeview. I have tried nesting repeaters, straight out html building from codebehind and the treeview control.

I still haven't found a solution... Can anyone help me out?

回答1:

Quickly, by head (could not check in VS2k8 now), I would do it something like this using Linq to SQL

private void BuildTree()
{
   List<Item> items = from item in dataContext.Items
                      select item;

   List<Item> rootItems = items.FindAll(p => p.ParentID == null );

   foreach ( Item item in rootItems )
   {
      TreeViewNode tvi = new TreeViewNode(item.text);
      BuildChildNodes(tvi, items, item.ID);
      YourTreeNodeName.Nodes.Add(tvi);
   }   
}

private void BuildChildNodes(TreeViewNode parentNode, List<Item> items, long parentID)
{
   List<Item> children = items.FindAll ( p => p.ParentID = parentID );
   foreach( Item item in children)
   {
      TreeViewNode tvi = new TreeViewNode(item.text);
      parentNode.Nodes.Add(tvi);
      BuildChildNodes(tvi, items, item.ID);         
   }
}


回答2:

As I understand it, if you have a database table with hierarchical data, you have two options: create your own custom data source, or programmatically bind the treeview to the database table.

I don't have code for you, but you could use following these steps:

  1. declare treeview control within asp.net page
  2. populate a DataTable (via a SqlDataAdapter) with your heirarchical data (SELECT itemID, parentID FROM...)
  3. use that same DataTable to create a DataView of top-level items (parentID will be null)
  4. for each row of the DataView, recursively add treeview items by filtering another DataView where each DataViewRow's parentID is equal to the row you're looping through in step 4

pretty much all of this is done using TreeView.Nodes.Add(theNewNode), where theNewNode is an instance of the TreeNode object

I know this all sounds very confusing, but I've done it in the past. I found great info in Stephen Walther ASP.NET Unleashed book, which has entire sections devoted to accomplishing this.