我想填写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字段来填充标签属性,....
我怎样才能做出一种通用的方法呢?
我希望自己足够清楚,不要犹豫问我问题:)
提前谢谢
答案 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)
你可以
但是,我认为编写的代码很好。有时你只需要对它进行编码,进一步抽象或优化它就没什么意义了。
我在代码中看到的唯一问题是你在循环中进行数据库调用。这是否是一个问题取决于应用程序。