GillouX
GillouX

Reputation: 469

best practice Treeview populating from differents kinds of objects

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

Upvotes: 2

Views: 2011

Answers (3)

GillouX
GillouX

Reputation: 469

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 ?

Upvotes: 1

Jamie Ide
Jamie Ide

Reputation: 49281

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.

Upvotes: 0

tomjen
tomjen

Reputation: 3889

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.

Upvotes: 0

Related Questions