我正在开发一个小型 C# windows 应用程序并且需要分层类别结构设计。我目前正在使用数据库中的单层类别,即没有子类别。我想开始并允许用户创建多个级别的类别。我查看了 Category 的这个线程数据结构,但我在想是否有更简单的方法来处理这类问题?因为我不确定这是否是解决问题的最佳方法。
如果有人可以提供数据库表结构和一些 C# 代码,我将不胜感激。我还想检查我是否能够从其父级获取所有子类别 ID(包括子子级)。
我正在开发一个小型 C# windows 应用程序并且需要分层类别结构设计。我目前正在使用数据库中的单层类别,即没有子类别。我想开始并允许用户创建多个级别的类别。我查看了 Category 的这个线程数据结构,但我在想是否有更简单的方法来处理这类问题?因为我不确定这是否是解决问题的最佳方法。
如果有人可以提供数据库表结构和一些 C# 代码,我将不胜感激。我还想检查我是否能够从其父级获取所有子类别 ID(包括子子级)。
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;
}
这是一个创建树的简单解决方案,当您重新处理对象层次结构时,该解决方案将需要一堆 DB 选择。您还需要存储一些可以减少选择次数的信息,并记住树中节点的顺序。
Joe Celko写了很多关于 SQL 树的文章,这些文章比我能输入的任何东西都更有价值。我在 sqlteam.com 上查看“ More Trees & Hierarchies in SQL ”时发现了该链接
Harvinder,
The database structure you're thinking about will work perfectly, but it has few disadvantages:
The most common practice is to store single ID (parent) in one column. In this case multiple children can point at the same parent (relation one-to-many), which solves your problem efficiently.
The second part of your question can be answered easily: unless you really have to, don't use Windows Forms (both authors used it) - you will find yourself extremely tired binding your datastructure to your view. It is a far better idea to use WPF for your purpose and flexibly modify Combobox and Treeview Datatemplates to face your requirements. If you're not familiar with WPF please start by having a look at this brilliant article concerning WPF and MVVM design pattern - it does even contain a Treeview examples, which will be helpful in your case.
Please tell me if my answer solved your problem. I'd be happy to answer any of your questions concerning WPF.
如果您的层次结构是固定的并且不会改变,您可以对其进行硬编码。
该线程是关于流动的并且可能不断变化的层次结构,在这种情况下,讨论的解决方案是合适的。
感谢您阅读我的问题的答复和考虑。
我目前已经有一个单一类别设置的结构,我知道这很容易。我正在考虑采取稍微简单的路线(我认为这是更简单的路线,但可能是错误的)。
我目前正在考虑在名为 children_ids 的类别表中添加一个额外的列。这样所有的父母都会记录那里的孩子,而不是相反。我的 children_ids 列可以是文本类型,并且 ids 可以以字符串格式存储,即 1-4-5-7-8 等,一旦我从数据库中获取此列,我可以使用“-”拆分字符串并获取所有其孩子的 id。
我认为这样我会更容易关注所有人口;),只需向父母询问他们的孩子。我认为它也会减轻依赖关系,因为我只需要更快地获取所有子项(递归以下所有级别)的列表。这样,我还可以在从数据库加载它们之前对所有整体进行排序,另一个头痛消失了。
我确信那里必须有更好的解决方案,但不知道它是否会更容易。
我的另一个要求是创建一个具有此类子父样式的下拉组合框,类似于文件夹列表结构供用户通过它们进行选择。也许像CodeProject example或CodeGuru example 之类的东西,我可能会使用其中一种方法来让我的生活更轻松一些。
问题是我想在下拉菜单的每条记录中添加更多详细信息,即 cat_id 等,但不希望它们对用户可见,这是为了获取有关用户选择的详细信息。我想我将不得不通过拥有一个单独的 ArrayList 来补偿它,它可能包含类别的所有详细信息,然后一旦用户从下拉列表中选择了一条记录,就转到它的索引位置。我想得直吗?
感谢您的阅读和回复!
收割机,
您是否考虑过将 TreeView 控件用于您的目的?我想这将是一个完美的主意。请查看有关 TreeView 控件的 MSDN 站点。点击这里。