【问题标题】:NodeEntryCollection can't get sub node childrenNodeEntryCollection 无法获取子节点子节点
【发布时间】:2017-08-14 14:32:27
【问题描述】:

从这个SO question 得到建议,我通过将路径数组转换为 NodeEntryCollection 来填充一个列表视图

NodeEntryCollection nodes = new NodeEntryCollection();
foreach (string line in lines)
{
    nodes.AddEntry(line, 0);
}

现在双击列表视图项目我正在使用它。

private void filesList_DoubleClick(object sender, EventArgs e)
{
    if (filesList.SelectedItems.Count == 0) return;

    if (filesList.SelectedItems[0].Tag.ToString() == "Folder")
    {
        string key = filesList.SelectedItems[0].Text;
        filesList.Clear();

        foreach (var item in nodes[key].Children) //Exception thrown here!
        {
            string fileName = Path.GetFileName(item.Key);
            string extension = Path.GetExtension(fileName);

            if (item.Value.Children.Count > 0)
            {
                ListViewItem itmNew = new ListViewItem(item.Key, 0);
                itmNew.Tag = "Folder";
                filesList.Items.Add(itmNew);

            }
            else
            {
                ListViewItem itmNew = new ListViewItem(item.Key, objIconListManager.AddFileIcon(fileName));
                itmNew.Tag = "File";
                filesList.Items.Add(itmNew);
            }
        }
    }
}

它在第一个目录上运行良好,我可以看到其中的文件,但是当我再次双击子目录时,它会抛出:

[KeyNotFoundException 未处理] 字典中没有给定的键。

【问题讨论】:

  • 请将异常添加为文本。图片网址无效。
  • 抛出什么异常?
  • *[KeyNotFoundException was unhandled] 给定的键不在字典中。
  • 仍然卡在这里。
  • 抛出异常时key的值是多少?

标签: c# dictionary nodes


【解决方案1】:

假设根据问题path data to tree like data structure,您的NodeEntryCollection 只是带​​有一些自定义项目添加逻辑的Dictionary<string, NodeEntry>,其中NodeEntry 本身就是string KeyNodeEntryCollection Children 的对。

NodeEntryCollection nodes 是您的根节点。比如这样填写:

nodes.AddEntry("root", 0);
nodes.AddEntry("root/main", 0);
nodes.AddEntry("root/main/dev", 0);

目前nodes 只有一个元素"root"Children"root" 也是 NodeEntryCollection,只有单个元素 "main" 等等。

您也可能通过迭代nodes 来填充filesList。所以列表中只显示root。当你双击它时,在这一行:

foreach (var item in nodes[key].Children)

key 的值为"root",您成功获得了集合中的第一个(也是单个)项目。遍历Children 后,main 将显示在列表中。一切正常。

然而,当你双击main时,你再次进入这个foreachkey的值是"main",但是nodes只有一个"root"键,显然KeyNotFoundException会被抛出。 其实你需要遍历当前选中节点的Children,也就是现在的"main",而不是你的根节点。

一种方法是跟踪您当前选择的节点。

NodeEntryCollection viewRoot;

最初,例如在nodes 填充,将其设置为您实际的树根节点:

viewRoot = nodes;

然后在您的事件处理程序中:

if (filesList.SelectedItems[0].Tag.ToString() == "Folder")
{
    string key = filesList.SelectedItems[0].Text;
    filesList.Clear();

    viewRoot = viewRoot[key].Children; // Set new view root

    //foreach (var item in nodes[key].Children) //Exception thrown here!
    foreach (var item in viewRoot) // iterate throught it
    {
        string fileName = Path.GetFileName(item.Key);
        string extension = Path.GetExtension(fileName);

        if (item.Value.Children.Count > 0)
        {
            ListViewItem itmNew = new ListViewItem(item.Key, 0);
            itmNew.Tag = "Folder";
            filesList.Items.Add(itmNew);

        }
        else
        {
            ListViewItem itmNew = new ListViewItem(item.Key, objIconListManager.AddFileIcon(fileName));
            itmNew.Tag = "File";
            filesList.Items.Add(itmNew);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    相关资源
    最近更新 更多