asp.net 中的树视图生成

本文关键字:视图 net asp | 更新日期: 2023-09-27 18:33:48

我有一个自己的结构的List类型。这是我的结构。

 public struct outlineData
    {
        public string paragraphID;
        public string outlineText;
        public int outlineLevel;
    }

我的列表是

List<outlineData> outlinePara = new List<outlineData>();

因此,我在我的 outlinePara List 中添加了很多 outlineData。现在,我想基于 outlineData 的 outlineLevel 创建一个 TreeView。

例如:大纲数据的大纲级别可以是 0,1,2,3,1,2....0,1

...0,1,1,1,1,1,1,2,3,2...。

所以,现在我想创建一个这样的树视图......

          0
             1
               2
                 3
             1
               2
          0
             1
          0
             1
             1
             1
             1
             1
               2
                 3
               2


TreeNode childNode;
            if (outlineParaInfo.outlineLevel == 0)
            {
                headNode = new TreeNode(outlineParaInfo.outlineText);
                TreeView11.Nodes.Add(headNode);
            }
            else if (outlineParaInfo.outlineLevel == 1)
            {
                childNode = new TreeNode(outlineParaInfo.outlineText);
                headNode.ChildNodes.Add(childNode);
            }

请指导我为这个问题获得正确的逻辑...

asp.net 中的树视图生成

[编辑以使用 System.Web.UI.WebControls.TreeView 每个操作注释]

像下面的伪代码怎么样:

int currentLevel = 0; 
TreeNode currentNode = null;
TreeNode childNode = null;
foreach(var outLineItem in outlinePara)
{
    if(outLineItem.outlineLevel == 0)
    {
            currentNode = new TreeNode(
                                outLineItem.paragraphID, outLineItem.outlineText);
            yourTreeView.Nodes.Add(currentNode);
            continue;
    }

    if(outLineItem.outlineLevel > currentLevel)
    {
        childNode = new TreeNode(
                          outLineItem.paragraphID, outLineItem.outlineText);
        currentNode.ChildNodes.Add(childNode);
        currentNode = childNode;
        currentLevel = outLineItem.outlineLevel;
        continue;
    }
    if(outLineItem.outlineLevel < currentLevel)
    {
       currentNode = currentNode.Parent;
       childNode = new TreeNode(
                          outLineItem.paragraphID, outLineItem.outlineText);
       currentNode.ChildNodes.Add(childNode);
       currentLevel = outLineItem.outlineLevel;
    }
}

就像Antonio Bakula说的,使用parentParagraphID。可以使用递归函数动态填充树视图

使用 parentParagraphID 更改大纲级别。

public struct outlineData
{
    public string paragraphID;
    public string outlineText;
    //public int outlineLevel;
    public string parentParagraphID;
}

创建列表后。

List<outlineData> outlinePara = new List<outlineData>();

首先插入根树节点,然后插入其余部分。

TreeNode rNode = new rNode();
rNode.Name = "root";
outlinePara.Add(rNode);
...
outlinePara.Add(lastNode);

插入所有节点后,只需启动此功能即可。

populate(rNode, rNode.Name);

此函数将为树视图创建关卡结构。

public void populate(TreeNode node, string parentParID)
{
    var newList = this.outlinePara.Where(x => x.parentParagraphID == parentParID).toList();
    foreach(var x in newList)
    {
        TreeNode child = new TreeNode();
        child.Name = paragraphID;
        child.Text = outlineText;
        populate(child, child.Name);
        node.Nodes.Add(child);
    }
}

你会得到一个像这样的树视图

root
|-->0
|   |-->1
|   |-->1
|       |-->2
|       |-->2
|       |-->2
|
|-->0
|   |-->1
|   ...
...

提示

在此代码中,ID 是一个字符串,最好使用其他东西,并且它必须是唯一的,这样您的数据放置在另一个 parentNode 中就不会出现问题。

 private void generateTreeView()
        {
            int currentLevel = 0;
            TreeNode currentNode = null;
            TreeNode childNode = null;

            foreach (var outLineItem in outlineParagraph)
            {
                if (outLineItem.outlineLevel == 0)
                {
                    currentNode = new TreeNode(outLineItem.outlineText);
                    TreeView11.Nodes.Add(currentNode);
                    currentLevel = outLineItem.outlineLevel;
                    continue;
                }
                if (outLineItem.outlineLevel > currentLevel)
                {
                    childNode = new TreeNode(outLineItem.outlineText);
                    currentNode.ChildNodes.Add(childNode);
                    currentNode = childNode;
                    currentLevel = outLineItem.outlineLevel;
                    continue;
                }
                if (outLineItem.outlineLevel < currentLevel)
                {
                    //logic to find exact outlineLevel parent...
                    currentNode = findOutlineLevelParent(outLineItem.outlineLevel, currentNode);
                    if(currentNode!=null)
                        currentNode = currentNode.Parent;
                    childNode = new TreeNode(outLineItem.outlineText);
                    currentNode.ChildNodes.Add(childNode);
                    currentLevel = outLineItem.outlineLevel;
                    currentNode = childNode;
                    continue;
                }
                if (outLineItem.outlineLevel == currentLevel)
                {
                    currentNode = currentNode.Parent;
                    childNode = new TreeNode(outLineItem.outlineText);
                    currentNode.ChildNodes.Add(childNode);
                    currentLevel = outLineItem.outlineLevel;
                    currentNode = childNode;
                    continue;
                }
            }
        }//generateTreeView Ends here...
        private TreeNode findOutlineLevelParent(int targetLevel, TreeNode currentNode)
        {
            while (currentNode.Parent != null)
            {
                currentNode = currentNode.Parent;
                if (currentNode.Depth == targetLevel)
                {
                    return currentNode;
                }
            }
            return null;
        }   //findOutlineLevelParent ends here...