繁体   English   中英

在TreeView中查看的订单列表

[英]Order List to view in TreeView

我想编写一个应用程序来按树名的顺序解析树状视图中的短链接:

Input:
bit.ly/sh125ad
adf.ly/sh1d5ad
bit.ly/sh1d5ad
adf.ly/sh125ad
adf.ly/sh12had

Output:
adf.ly
    adf.ly/sh1d5ad
    adf.ly/sh125ad
    adf.ly/sh12had
bit.ly
    bit.ly/sh125ad
    bit.ly/sh1d5ad

在我写了解析部分之后:

List<string> links = linkField.Text.Split('\n').ToList();

我不知道如何在treeView.Nodes添加父节点,然后添加Child节点。 我的尝试是:

foreach (string link in links)
{
    Uri url = new Uri(link);
    if (!treeView.Nodes.Contains(new TreeNode(url.Host)))
         treeView.Nodes.Add(new TreeNode(url.Host));
}

但是,如果我想添加链接,由于它的子节点,我找不到第一个TreeNode

这是一个有点混乱的方法,但是它可以快速完成您想要的操作。 首先创建一个类来保存每个uniqe域及其URL:

public class ShortLink
{
    public string DomainName { get; set; }
    public List<string> UrlList;

    public ShortLink(string domainName)
    {
        DomainName = domainName;
        UrlList = new List<string>();
    }

    public void AddUrl(string url)
    {
        if(!UrlList.Contains(url))
            UrlList.Add(url);
    }

    public string GetFullUrl(int indexOfUrlInList)
    {
        return DomainName + "/" + UrlList[indexOfUrlInList];
    }

    //Add other methods like remove and stuff
}

假设您的表单有一个称为treeView1的Treview,然后尝试以下代码:

public partial class Form1 : Form
{
    private List<string> _links = new List<string>(new []{
        "bit.ly/sh125ad",
        "adf.ly/sh1d5ad",
        "bit.ly/sh1d5ad",
        "adf.ly/sh125ad",
        "adf.ly/sh12had"
    });

    private List<ShortLink> _shortLinks = new List<ShortLink>();

    public Form1()
    {
        InitializeComponent();

        PopulateTreeView();
    }

    private void PopulateTreeView()
    {
        //Make the dictionary
        foreach (var link in _links)
        {
            var parts = link.Split('/');
            var domainPart = parts[0];

            if (!_shortLinks.Contains(_shortLinks.FirstOrDefault(x => x.DomainName == domainPart)))
            {
                var shortLink = new ShortLink(domainPart);
                _shortLinks.Add(shortLink);
            }
        }

        foreach (var link in _links)
        {
            var parts = link.Split('/');
            var domainPart = parts[0];
            var urlPart = parts[1];
            //find a ShortLink in the list we made that matches this domainpart
            var shortLink = _shortLinks.FirstOrDefault(x => x.DomainName == domainPart);

            //if its not null, we add the url part to taht!
            if(shortLink != null)
                shortLink.AddUrl(urlPart);

            //now we have all domains and parts
        }


        //Populate treeview
        foreach (var shortLink in _shortLinks)
        {
            var parentNode = new TreeNode(shortLink.DomainName);
            var childNodes = new List<TreeNode>();

            //add all the links in the current shortLink to the list of treenodes
            foreach (var link in shortLink.UrlList)
            {
                childNodes.Add(new TreeNode(link));
            }

            //now time to add child notes to parent node
            parentNode.Nodes.AddRange(childNodes.ToArray());

            treeView1.Nodes.Add(parentNode);
        }
    }
}

UPDATE

我刚刚意识到您的问题实际上是关于找到父节点的。 请参阅以下方法:

private void AddToTreeView(string domain, string link)
{
    foreach (TreeNode node in treeView1.Nodes)
    {
        if (node.Text == domain)
        {
            node.Nodes.Add(link);
        }
    }
}

当然,在foreach循环中创建Node时,您可以创建完整的节点详细信息。 您可以为每个节点设置诸如NameTag类的文件,以备将来使用!

您也可以子类化TreeNode并为其拥有自己的自定义字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM