2009-12-16 130 views
1

我正在开发一个小型的C#windows应用程序,并需要进行分层结构设计。我正在使用来自数据库的单层类别,即没有子类别。我想去看看并允许用户创建多个级别类别。我看着这个线程Data structure for Category,但我在想如果有更简单的方法来处理这类问题?因为我不确定这是否是问题的最佳解决方案。C#分层结构分类结构

我将不胜感激,如果有人可以提供数据库表结构和一些C#代码代码去与它。此外,我想检查是否可以从其父母处获取所有子类别ID(包括子子女)。

回答

0

如果你的层级是刚性的,不会改变,你可以对它进行硬编码。

该线程是关于流体层次结构,可能会不断变化,在这种情况下,讨论的解决方案是适当的。

0

Harvinder,

您是否考虑过使用TreeView控件来达到您的目的?我想这将是一个完美的想法。请查看有关TreeView控件的MSDN网站。 Click here

+0

嗨 是的树视图确实符合我的一些要求,但我想为列表中的每个记录(行)都有真实图像。我发现了ObjectListView库,似乎有能力实现这一点。 http://objectlistview.sourceforge.net/cs/index.html – Harvinder 2009-12-19 15:41:39

4
create table Category 
(
    id int primary key identity, 
    parent_id int, 
    name varchar(100), 
    foreign key (parent_id) references Category (id) 
) 

class Category 
{ 
    int id; 
    string name; 
    Category Parent; 
    IList<Category> Children; 
} 

这是一个天真的解决方案来建立一棵树,当你解除冻结您的对象层次,该解决方案将需要一堆DB选择的。您还需要存储一些将减少选择数量的信息,并记住树中节点的顺序。

Joe Celko在SQL树上有written quite a bit,它比我能输入的任何东西都重要。我发现链接,同时在sqlteam.com上查看“More Trees & Hierarchies in SQL

0

感谢您阅读我的问题的回复和考虑。

我目前已经有一个单一的类别设置的结构,我很容易知道。我正在考虑采取稍微简单的路线(我认为这是更简单的路线,但可能是错误的)。

我目前正在考虑在名为children_ids的分类表中添加一个额外的列。这样所有的父母都会保留孩子的记录而不是其他方式。我children_ids列可以是文本类型和ids可以存储在一个字符串格式,即1-4-5-7-8等,一旦我从数据库中得到这个列,我可以用' - '拆分字符串,并获得所有其子女的ID。

我认为这样会让我更容易留意所有的人口;),只要问家长有关他们的孩子。我认为这也会减轻依赖性,因为我只需要得到一个所有孩子(递归地低于所有级别)的列表,我猜更快。通过这种方式,我还可以在从数据库中加载它们之前对所有实体进行排序,但另一个头痛消失了。

我相信在那里必须有更好的解决方案,但不知道是否会更容易。

我的其他要求是创建一个带有这种类别的子 - 父类型的下拉组合框,类似于用户通过它们选择的文件夹列表结构。也许像CodeProject exampleCodeGuru example,我可能会使用任何一种方法让我的生活变得更容易一些。

问题是我想在下拉菜单的每个记录中添加更多细节,例如cat_id等,但不希望它们对用户可见,这是为了获得有关用户选择的详细信息。我想我将不得不通过单独的ArrayList来弥补它,可能会包含所有类别的细节,然后只要用户从下拉列表中选择一条记录,就可以进入索引位置。我在想什么?

感谢您阅读和回复!

+0

链接似乎被打破... – 2012-08-03 07:10:37

0

Harvinder,

你正在考虑数据库结构将很好地工作,但它有一些缺点:

  • 简单的SQL查询找到指定节点的所有的孩子是不可能的(你会执行字符串操作)
  • 儿童的数量排序是不可能从SQL查询中
  • 得到节点的子节点的集合,你必须连接到数据库几次(让每个孩子分别由它的ID)

最常见的做法是存储单ID(父)在一列中。在这种情况下,多个孩子可以指向同一父母(关系一对多),这可以有效地解决您的问题。你可以很容易地回答你的问题的第二部分:除非你真的必须,不要使用Windows窗体(两个作者都使用它) - 你会发现你非常疲惫,将你的数据结构绑定到你的视图。为你的目的使用WPF是一个好得多的主意,并灵活地修改Combobox和Treeview Datatemplates来面对你的需求。如果您对WPF不熟悉,请首先查看关于WPF和MVVM设计模式的brilliant article - 它甚至包含Treeview示例,这对您的情况会有所帮助。

请告诉我,如果我的答案解决了您的问题。我很乐意回答有关WPF的任何问题。

+0

感谢您的详细信息,是的存储parent_id似乎是更好的解决方案的问题。然而,我将使用children_id来代替,因为我的要求是,一旦获得了父项,我就可以获得所有子项,我将从我的应用程序而不是数据库中处理这些项目(我知道这将会非常耗费CPU周期)但对我来说似乎是一个更简单的解决方案。所以我会将所有的类别动态加载到应用程序中并从那里创建树,它将只是一个小的递归方法。 – Harvinder 2009-12-22 17:43:00

+0

现在,我正在寻找一个好的库来处理treelistviews中的图像,我找到了一个名为ObjectListView的好库,它处理图像,但文档和示例并不多,因此仍在测试和玩弄它。 谢谢 – Harvinder 2009-12-22 17:44:56

+0

不是问题:)任何问题 - 只问我。 – 2009-12-22 19:11:15