tags:

views:

439

answers:

3

Hello,

I would like to populate a Treeview.

Here is what I have in DB :

table : Box BoxID BoxName

table Book : BookID BookName BoxID (fk Box.BoxID)

table Chapter: ChapterID ChapterName BookID (fk Book.BookID)

As you may know a treeview is made up of treenode object. A treenode object have a text property and a tag property. The "text" property is the text that it's display on the screen for this node and the "tag" is an "hidden" value (usually uses to identify a node)

So in my case; the fields ending with ID will be used in the "tag" property and the fields ending with Name will be used in the "text" property

example : so for a book; I will use the BookID field for the "tag" property and BookName field for the "text" property

note : I use a dbml so I have a Book object, Box object and Chapter object and I use linq to get them from the db.

So my question is; what is the best practice to build this tree?

I have a solution but it's really ugly because it looks like I'm duplicating the code. The problem is that the values I need to extract for the text and tag properties are identified by differents fields name in the db

So for the book level, I need to get the BookID field to populate the tag property of my node; for the box level, I need to get the BoxID field to populate the tag property , ....

How can I make a kind of generic way to do it ?

I hope I made myself clear enough, don't hesitate to ask me questions :)

Thx in advance

A: 

I would extract the you need from the database in the form of a struct, possibly via the anonnoumous type that has been added to C# together with linq. Then I would populate insert this data into the place in the tree.

From what I get, you are trying to get each property separately, which will not work so well, because then you will have to make a call to the database for each separate property, which is very wasteful.

Addition based on what you have added

I do not believe the code can be more compact - the names you call are similar, but not the same and the way you do it was what I was trying to explain earlier.

tomjen
I get the list of box with a linq (dbml) request.I get a List<Box>Treenode tnBox = null;Treenode tnBook =null;foreach(Box b in MyListofBox){ tnBox = new TreeNode(); tnBox.tag = b.BoxID; tnBox.text = b.BoxName; List<Book> MyListofBook = getMyListofBookByBoxID(b.BoxID) foreach(Book boo in MyListofBook ) { tnBook = new TreeNode(); tnBook .tag = boo.BookID; tnBook .text = boo.BookName; tnBox.nodes.add(tnBook); } mytreeview.nodes.add(tnBox);}}
A: 

Here is what I have for the moment

I get the list of box with a linq (dbml) request.

    List<Box> MyListofBox = getMyListofBox();
Treenode tnBox = null;
Treenode tnBook =null;
foreach(Box b in MyListofBox )
{
   tnBox = new TreeNode();
   tnBox.tag = b.BoxID;
   tnBox.text = b.BoxName;

   List<Book> MyListofBook = getMyListofBookByBoxID(b.BoxID)
   foreach(Book boo in MyListofBook )
   {
     tnBook = new TreeNode();
     tnBook.tag = boo.BookID;
     tnBook.text = boo.BookName;
     tnBox.nodes.add(tnBook);
   }
   mytreeview.nodes.add(tnBox);
}
}

but of course I don't like this solution...

do you have a better way ?

A: 

You could

  1. Define an key/value interface that both Box and Book implement
  2. Define a delegate that returns a TreeNode and create delegate methods that accept Box and Book

However, I think the code is fine as written. Sometimes you just have to code it and there's little point in further abstracting or optimizing it.

The only issue I see in the code is that you're making a database call in a loop. Whether or not that's a problem depends on the application.

Jamie Ide
So I guess I'm going to keep my solution.thx anyway