我正在开发一个程序,其中包含一个目录(主目录和每个目录包含子目录,每个子目录包含sub2目录等等......直到最终目录包含.doc文件作为对象。) 示例:
如何设计数据库以接受此树层次结构,然后我可以获取每个目录并在我的c#程序中打开任何.doc。
我是使用树视图和数据库的初学者。
由于
修改
我有7个主文件夹,每个文件夹都有多个子文件夹,可能有些子文件夹1有另外的子文件夹2,其中包含文件,其他子文件夹1也有文件。 (所有文件几乎都是10000。)
问题:
我如何将此结构填充到数据库中,然后我可以在树视图或列表框中列出它们?
由于
答案 0 :(得分:1)
由于你在树上,你可能会看一下:
<强>类强>
public class FolderEntry {
public string Name {
get; set;
}
public List<FolderEntry> FolderEntries {
get; set;
}
public List<FileEntry> Files {
get; set;
}
}
public class FileEntry {
public string Name {
get; set;
}
public string FileType {
get; set;
}
}
<强>数据库设计:强>
这不是一个完整的解决方案,但你可以从这开始。 为了用数据填充类,我建议你实现一个RepositoryPattern
答案 1 :(得分:1)
只需一张桌子就可以获得无限级别的无限结构。我将在这里使用MS SQL。但同样的逻辑也适用于MS Access。
Id是行的唯一标识符。 ParentId是对此行所在的Id的引用。换句话说,当前行的Parent。 Name是包含目录或文件名的字段。 IsFile(可以省略)是确定这是文件还是目录。您实际上可以在代码中应用一些逻辑来检查该行是否有任何子代。如果此行中有子项,则只需将其标记为目录即可。
然后我们可以用一些数据填充这个表
如果您使用的是MS SQL Server 2005及更高版本,则只需创建一个CTE(公用表表达式)即可自动生成整个树。但是Access不支持公用表表达式。
在问题中标记C#时,如果项目有子项,则应使用C#创建递归函数来调用自身。
PopulateMenu();
private void PopulateMenu()
{
var parentItems = GetMenuItemsWhereParentIdIsNull();
foreach(var item in parentItems)
{
Console.WriteLine(item["Name"]);
PopulateChildrenByItem(item);
}
}
private void PopulateChildrenByItem(object item)
{
var childItems = GetMenuItemsByParentId(item["Id"]);
foreach(var item in childItems)
{
Console.WriteLine("Child Item: " + item["Name"]);
//Recursively check for children of this child item
PopulateChildrenByItem(item["Id"]);
}
}
function object GetMenuItemsWhereParentIdIsNull()
{
//code for getting the parent items from access via ado.net
//query should be something like "SELECT * FROM Menu WHERE ParentId IS NULL"
}
function object GetMenuItemsByParentId(int Id)
{
//code for getting the child items by given parentId from access via ado.net
//query should be something like "SELECT * FROM Menu WHERE ParentId = <Id>"
}
请注意,PopulateChildrenByItem正在调用自身来检查迭代项的子项。
我希望这会引导你走向正确的方向
干杯