【问题标题】:Order List to view in TreeView在 TreeView 中查看的订单列表
【发布时间】:2014-04-17 18:09:33
【问题描述】:

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

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 中添加父节点,然后添加子节点。 我的尝试是:

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,因为它的子节点

【问题讨论】:

    标签: c# winforms dictionary treeview


    【解决方案1】:

    这有点混乱,但它很快就可以满足您的需求。首先创建一个类来保存每个 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);
            }
        }
    }
    

    更新

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

    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 子类化并为其添加自己的自定义字段。

    【讨论】:

    • 看起来像它的工作。但我会编辑 URI 解析部分,因为 .NET 有一个内置类,它具有 Host 等属性... URI foo = new URI(link);
    • @user3412531 好吧,这取决于你……这只是一个肮脏的解决方案,还有很大的改进空间。
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 2011-07-05
    • 2020-10-30
    • 2021-11-02
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多