最佳实践Treeview从不同种类的对象中填充

时间:2009-04-19 11:17:55

标签: treeview

我想填写Treeview。

以下是我在DB中的内容:

表:Box BoxID BoxName

表书: 的BookID BOOKNAME BoxID(fk Box.BoxID)

表章节: ChapterID CHAPTERNAME BookID(fk Book.BookID)

您可能知道树视图由treenode对象组成。 treenode对象具有text属性和tag属性。 “text”属性是它在此节点的屏幕上显示的文本,“tag”是“隐藏”值(通常用于标识节点)

所以在我的情况下;以ID结尾的字段将在“tag”属性中使用,以Name结尾的字段将在“text”属性中使用

示例: 所以对于一本书;我将BookID字段用于“tag”属性,BookName字段用于“text”属性

注意:我使用dbml,所以我有一个Book对象,Box对象和Chapter对象,我使用linq从db中获取它们。

所以我的问题是;构建这棵树的最佳做法是什么?

我有一个解决方案,但它真的很难看,因为它看起来像是在重复代码。 问题是我需要为text和tag属性提取的值由db中的differents字段名称标识

因此,对于图书级别,我需要获取BookID字段来填充我的节点的tag属性;对于盒子级别,我需要获取BoxID字段来填充标签属性,....

我怎样才能做出一种通用的方法呢?

我希望自己足够清楚,不要犹豫问我问题:)

提前谢谢

3 个答案:

答案 0 :(得分:1)

这是我目前所拥有的

我获得了带有linq(dbml)请求的框列表。

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);
}

但我当然不喜欢这个解决方案...

你有更好的方法吗?

答案 1 :(得分:0)

我会以结构的形式从数据库中提取您的需求,可能是通过与linq一起添加到C#的anonnoumous类型。然后我会填充将这些数据插入到树中的位置。

从我得到的,你试图单独获得每个属性,这将无法正常工作,因为那时你将不得不为每个单独的属性调用数据库,这是非常浪费的。

根据您添加的内容添加

我不相信代码可以更紧凑 - 你调用的名字是相似的,但不一样,你这样做的方式就是我之前试图解释的。

答案 2 :(得分:0)

你可以

  1. 定义Box和Book实现的键/值接口
  2. 定义一个返回TreeNode的委托,并创建接受Box和Book
  3. 的委托方法

    但是,我认为编写的代码很好。有时你只需要对它进行编码,进一步抽象或优化它就没什么意义了。

    我在代码中看到的唯一问题是你在循环中进行数据库调用。这是否是一个问题取决于应用程序。