Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于具有父/子链接的单个数据库表向树视图添加子节点_C#_Treeview - Fatal编程技术网

C# 基于具有父/子链接的单个数据库表向树视图添加子节点

C# 基于具有父/子链接的单个数据库表向树视图添加子节点,c#,treeview,C#,Treeview,我正在尝试构建一个树视图,其中子节点基于单个数据库表,其中的行可以链接到指示父/子关系的其他行 例如,给定表格: ID ID_parent Ten 1 null a 2 1 b 3 1 c 4 null d 5 4 e 6 4 f 我是十个家长 1空a 21 b 3 1 c 4零d 5.4 e 6.4楼 我想展示一下: a b c d e f A. B C

我正在尝试构建一个树视图,其中子节点基于单个数据库表,其中的行可以链接到指示父/子关系的其他行

例如,给定表格:

ID ID_parent Ten 1 null a 2 1 b 3 1 c 4 null d 5 4 e 6 4 f 我是十个家长 1空a 21 b 3 1 c 4零d 5.4 e 6.4楼 我想展示一下:

a b c d e f A. B C D E F
在不知道数据检索技术或如何将数据绑定到组件的情况下,我将尽可能地成为一个泛型

您需要做的第一件事是从数据库中取出数据。在SQLServer中有分层实现的方法,但本着通用性的精神,让我们假设您将把它作为一个平面结构来实现。重要的是,您的数据是按其父id排序的,您可以在sql或代码中这样做

假设您现在有一组有序的数据,我们可以填充节点对象。这方面的一个例子是:

public class Node : ICollection<Node>
{
    private List<Node> childNodes;

    public Node()
    {
        childNodes = new List<Node>();
    }

    public Node this[int index]
    {
        get { return childNodes[index]; }
        set { childNodes[index] = value; }
    }

    public void Add(Node childNode)
    {
        childNodes.Add(childNode);
    }            

    /* Rest of ICollection<T> implementation */
}
公共类节点:ICollection
{
私有列表子节点;
公共节点()
{
childNodes=新列表();
}
公共节点此[int索引]
{
获取{return childNodes[index];}
集合{childNodes[index]=value;}
}
公共无效添加(节点子节点)
{
添加(childNode);
}            
/*ICollection实现的其余部分*/
}
现在,要填充结构,您需要遍历原始数据

public Node PopulateTree(TreeData[] treeData)
{
    Dictionary<{IdType}, Node> flattenedTree = new Dictionary<{IdType}, Node>();

     foreach(TreeData data in treeData)
     {
         Node node = new Node();

         if (data.ParentId != {EmptyId})
         {
             Node parentNode = flattenedTree[data.ParentId];
             parentNode.Add(node);
         }

         flattenedTree.Add(data.Id, node);
     }
}
public节点PopulateTree(TreeData[]TreeData)
{
Dictionary FlattedTree=新字典();
foreach(TreeData中的TreeData数据)
{
节点=新节点();
if(data.ParentId!={EmptyId})
{
节点parentNode=flattedTree[data.ParentId];
parentNode.Add(节点);
}
FlattedTree.Add(data.Id,节点);
}
}

我还没有测试伪代码,但它应该向您展示一种将扁平化数据转换为层次结构的方法。您应该能够将其重构为一个更干净的结构,但具体如何重构取决于您的代码库。

在不了解数据检索技术或如何将数据绑定到组件的情况下,我将尽可能采用通用的方法

您需要做的第一件事是从数据库中取出数据。在SQLServer中有分层实现的方法,但本着通用性的精神,让我们假设您将把它作为一个平面结构来实现。重要的是,您的数据是按其父id排序的,您可以在sql或代码中这样做

假设您现在有一组有序的数据,我们可以填充节点对象。这方面的一个例子是:

public class Node : ICollection<Node>
{
    private List<Node> childNodes;

    public Node()
    {
        childNodes = new List<Node>();
    }

    public Node this[int index]
    {
        get { return childNodes[index]; }
        set { childNodes[index] = value; }
    }

    public void Add(Node childNode)
    {
        childNodes.Add(childNode);
    }            

    /* Rest of ICollection<T> implementation */
}
公共类节点:ICollection
{
私有列表子节点;
公共节点()
{
childNodes=新列表();
}
公共节点此[int索引]
{
获取{return childNodes[index];}
集合{childNodes[index]=value;}
}
公共无效添加(节点子节点)
{
添加(childNode);
}            
/*ICollection实现的其余部分*/
}
现在,要填充结构,您需要遍历原始数据

public Node PopulateTree(TreeData[] treeData)
{
    Dictionary<{IdType}, Node> flattenedTree = new Dictionary<{IdType}, Node>();

     foreach(TreeData data in treeData)
     {
         Node node = new Node();

         if (data.ParentId != {EmptyId})
         {
             Node parentNode = flattenedTree[data.ParentId];
             parentNode.Add(node);
         }

         flattenedTree.Add(data.Id, node);
     }
}
public节点PopulateTree(TreeData[]TreeData)
{
Dictionary FlattedTree=新字典();
foreach(TreeData中的TreeData数据)
{
节点=新节点();
if(data.ParentId!={EmptyId})
{
节点parentNode=flattedTree[data.ParentId];
parentNode.Add(节点);
}
FlattedTree.Add(data.Id,节点);
}
}

我还没有测试伪代码,但它应该向您展示一种将扁平化数据转换为层次结构的方法。您应该能够将其重构为更干净的结构,但具体如何重构取决于您的代码库。

好问题,难回答。我前一段时间不得不这么做,我会看看是否能让它更通用,提供一个答案。好问题,难回答。我前一段时间不得不这样做,我会看看是否可以让它更通用,以提供一个答案。