C#Hierarchical Categories结构

问题描述 投票:1回答:5

我正在开发一个小型的C#windows应用程序,并且需要Hierarchical Categories结构设计。我目前使用来自DB的单层类别,即没有子类别。我想继续并允许用户创建多个级别的类别。我调查了这个线程Data structure for Category,但我在想是否有更简单的方法来处理这类问题?因为我不确定这是否是问题的最佳解决方案。

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

c# data-structures parent-child categories
5个回答
4
投票
create table Category
(
     id int primary key identity,
     parent_id int,
     name varchar(100),
     foreign key (parent_id) references Category (id)
)

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

这是一个创建树的天真解决方案,当您为对象层次结构重新水化时,该解决方案将需要大量的数据库选择。您还需要存储一些可减少选择次数的信息,并记住树中节点的顺序。

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


0
投票

如果您的层次结构是严格的并且不会更改,则可以对其进行硬编码。

该线程是关于层次结构的流动性并且可能不断变化,并且在该场景中,所讨论的解决方案是适当的。


0
投票

Harvinder,

您是否考虑过将TreeView控件用于您的目的?我想这将是一个完美的主意。请查看有关TreeView控件的MSDN站点。 Click here


0
投票

Harvinder,

您正在考虑的数据库结构将完美运行,但它有一些缺点:

  • 简单的sql查询找不到指定节点的所有子节点(你必须执行字符串操作)
  • 在sql查询中不可能按子项数排序
  • 要获取节点子节点的集合,您必须多次连接到数据库(通过其ID分别获取每个子节点)
  • 等等

最常见的做法是将单个ID(父)存储在一列中。在这种情况下,多个孩子可以指向同一个父级(关系一对多),这可以有效地解决您的问题。

您的问题的第二部分可以轻松回答:除非您真的必须,不要使用Windows窗体(两位作者都使用它) - 您会发现自己非常疲惫地将数据结构绑定到您的视图。将WPF用于您的目的并灵活地修改Combobox和Treeview Datatemplates以满足您的要求是一个好主意。如果您不熟悉WPF,请首先查看有关WPF和MVVM设计模式的brilliant article - 它甚至包含一个Treeview示例,这对您的案例很有帮助。

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


0
投票

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

我目前已经有一个单一类别设置的结构,我很清楚。我想考虑采用一种稍微简单的路线(我认为路线更简单,但可能是错误的)。

我目前正在考虑在类别表中添加一个名为children_ids的额外列。因此,所有的父母都会记录那里的孩子,而不是相反。我的children_ids列可以是Text类型,id可以以字符串格式存储,即1-4-5-7-8等。一旦我从DB中获取此列,我可以用' - '分割字符串并获取所有孩子的ids。

我认为通过这种方式,我可以更容易地关注所有人群;),只要向父母询问他们的孩子。我认为这也将减轻依赖性系列,因为我只需要更快地得到所有孩子的列表(递归以下的所有级别)。这样我也可以在从DB加载它们之前对所有entires进行排序,另一个令人头痛的问题。

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

我的另一个要求是创建一个具有此类子父级样式的下拉组合框,类似于用户可通过它们选择的文件夹列表结构。也许像CodeProject exampleCodeGuru example这样的东西,我可能会使用其中一种方法让我的生活变得更轻松。

问题是我想在下拉菜单的每个记录中添加更多细节,即cat_id等,但不希望它们对用户可见,这是为了获得用户选择的详细信息。我想我必须通过拥有一个单独的ArrayList来补偿它,可能包含类别的所有细节,然后只要用户从下拉列表中选择一条记录就转到它的索引位置。我在想吗?

感谢阅读和回复!

© www.soinside.com 2019 - 2024. All rights reserved.