1

自分の構造体のリストタイプが1つあります。これが私の構造体です。

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

私のリストは

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

そこで、outlinePara Listに非常に多くのoutlineDataを追加しました。次に、outlineDataのoutlineLevelに基づいてTreeViewを作成します。

例:outlineDataのoutlineLevelは0,1,2,3,1,2 .... 0,1 ...0,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);
            }

この問題の正しいロジックを取得するために私を導いてください...

4

3 に答える 3

1

[OPコメントごとに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;
    }
}
于 2012-05-11T11:49:42.643 に答える
0

アントニオ・バクラが言ったように、parentParagraphIDを使用します。再帰関数を使用して、ツリービューに動的にデータを入力できます

parentParagraphIDを使用してoutlineLevelを変更します。

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

リストを作成した後。

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

最初にルートTreeNodeを挿入し、次に残りを挿入します。

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

すべてのノードを挿入したら、この関数を起動するだけです。

populate(rNode, rNode.Name);

この関数は、TreeViewのレベル構造を作成します。

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);
    }
}

このようなTreeViewが表示されます

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

ヒント

このコードでは、IDは文字列であり、他のものを使用する方がはるかに優れており、一意である必要があるため、別のparentNodeに配置されたデータで問題が発生することはありません。

于 2012-05-11T20:20:29.110 に答える
0
 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...
于 2012-05-15T07:04:30.250 に答える