【问题标题】:best practice Treeview populating from differents kinds of objects最佳实践 Treeview 从不同类型的对象中填充
【发布时间】:2009-04-19 11:17:54
【问题描述】:

我想填充树视图。

这是我在 DB 中的内容:

表:盒子 盒子ID 盒子名称

桌书: 书号 书名 BoxID (fk Box.BoxID)

表章节: 章节ID 章节名称 BookID (fk Book.BookID)

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

所以在我的情况下;以 ID 结尾的字段将用于 "tag" 属性,以 Name 结尾的字段将用于 "text" 属性

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

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

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

我有一个解决方案,但它真的很难看,因为看起来我在复制代码。 问题是我需要为文本和标签属性提取的值由数据库中的不同字段名称标识

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

我怎样才能做出一种通用的方式来做到这一点?

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

提前谢谢

【问题讨论】:

    标签: treeview


    【解决方案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);
    }
    

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

    你有更好的方法吗?

    【讨论】:

      【解决方案2】:

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

      据我所知,您正在尝试单独获取每个属性,这不会很好,因为您必须为每个单独的属性调用数据库,这是非常浪费的。

      根据您添加的内容添加

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

      【讨论】:

      • 我得到了带有 linq (dbml) 请求的框列表。我得到一个 List Treenode tnBox = null;树节点 tnBook =null; foreach(MyListofBox 中的框 b) { tnBox = new TreeNode(); tnBox.tag = b.BoxID; tnBox.text = b.BoxName; List MyListofBook = getMyListofBookByBoxID(b.BoxID) foreach(MyListofBook 中的 Book boo) { tnBook = new TreeNode(); tnBook .tag = boo.BookID; tnBook .text = boo.BookName; tnBox.nodes.add(tnBook); } mytreeview.nodes.add(tnBox); } }
      【解决方案3】:

      你可以

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多