【问题标题】:Iterating through a List to show in TreeView遍历列表以在 TreeView 中显示
【发布时间】:2018-06-06 03:43:12
【问题描述】:

我有四个列表,我正试图让内容显示在我的 Form 上的 TreeView 中。
我当前的问题是视图中只显示每个列表中的最后一项。
我确信这与我遍历列表的方式有关,但我非常坚持如何让每个单独的列表项显示在树中。

我的树结构是:

Dog
   Husky
      huskylist
   Chiwawa
      chiwawlist
Cat
   Siamese
       siameselist
   Tabby
        tabbylist

我的 Form 代码,其中树视图是:

public partial class Form1 : Form
{
    private Model m_modelObj;
    public Form1(Model modelObj)
    {
        InitializeComponent();

        m_modelObj = modelObj;

        List<Tabby> tabbyList = m_modelObj.TabbyList;
        List<Siamese> siameseList = m_modelObj.SiameseList;
        List<Husky> huskyList = m_modelObj.HuskyList;
        List<Chiwawa> chiwawaList = m_modelObj.ChiwawaList;

       //tree code

        //add husky list
        TreeNode node8 = null;
        foreach (var item in huskyList)
        {
            node8 = new TreeNode(item.name);       
        }

        TreeNode[] husky = new TreeNode[] { node8 };

        //add chiwawa list
        TreeNode node9 = null;
        foreach (var item in chiwawaList)
        {
            node9 = new TreeNode(item.name);
        }

        TreeNode[] chiwawa = new TreeNode[] { node9 };

        //dog breed
        TreeNode node2 = new TreeNode("Husky", husky);
        TreeNode node3 = new TreeNode("Chiwawa", chiwawa);
        TreeNode[] dog = new TreeNode[] { node2, node3 };

        //dog parent
        TreeNode treeNode = new TreeNode("Dogs", dog);
        treeView1.Nodes.Add(treeNode);

        //add tabby list
        TreeNode nodes = null;

        foreach (var item in tabbyList)
        {
            nodes = new TreeNode(item.name);
        }

        TreeNode[] tabby = new TreeNode[] { nodes };

        //add siamese list
        TreeNode node7 = null;
        foreach (var item in siameseList)
        {
            node7 = new TreeNode(item.name);
        }

        TreeNode[] siamese = new TreeNode[] { node7 };

        //cat breed
        TreeNode node4 = new TreeNode("Siamese", siamese);
        TreeNode node5 = new TreeNode("Tabby", tabby);
        TreeNode[] cat = new TreeNode[] { node4, node5 };

        //cat parent
        treeNode = new TreeNode("Cats", cat);
        treeView1.Nodes.Add(treeNode);
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void addDetailsBtn_Click(object sender, EventArgs e)
    {
        string animalType = comboBoxAnimalType.SelectedItem.ToString();
        this.Hide();
        PetInfoForm aPetInfoForm = new PetInfoForm(animalType, m_modelObj);
        aPetInfoForm.Closed += (s, args) => this.Close();
        aPetInfoForm.Show();
    }
}

【问题讨论】:

  • 您可能需要重新访问您的代码。例如。您正在 for 循环中替换 node9 。您将看到 chiwawa 中的最后一个节点。您实际上可以执行类似于 chiawawa.Nodes.add(new TreeNode(item.name)) 的操作或使用 lambda select
  • 您可以从“树结构”中获取一些自我建议,并为您的类定义某种抽象级别,以生成更“紧凑”的动物列表。那么 LINQ 将成为你的朋友。
  • 您正在循环中创建node8 并在每次迭代时覆盖它.. 所以其中的值将是迭代的最后一个值.. 然后您将其添加到树列表中.. 以此类推树列表..只有最后一个值..

标签: c# .net winforms treeview


【解决方案1】:

在c#中创建对象和动态数组Refer here

TreeView 基础看懂Refer here

当您创建子节点时,您将覆盖实例。你应该维护一个数组中的节点。

        //tree code

        //add husky list
        List<TreeNode> node8 = new List<TreeNode>();
        foreach (var item in huskyList)
        {
            node8.Add(new TreeNode(item.name));
        }

        TreeNode[] husky = node8.ToArray();

        //add chiwawa list
        List<TreeNode> node9 = new List<TreeNode>();
        foreach (var item in chiwawaList)
        {
            node9.Add(new TreeNode(item.name));
        }

        TreeNode[] chiwawa = node9.ToArray();

        //dog breed
        TreeNode node2 = new TreeNode("Husky", husky);
        TreeNode node3 = new TreeNode("Chiwawa", chiwawa);
        TreeNode[] dog = new TreeNode[] { node2, node3 };

        //dog parent
        TreeNode treeNode = new TreeNode("Dogs", dog);
        treeView1.Nodes.Add(treeNode);

        //add tabby list
        List<TreeNode> nodes = new List<TreeNode>();

        foreach (var item in tabbyList)
        {
            nodes.Add(new TreeNode(item.name));
        }

        TreeNode[] tabby =nodes.ToArray();

        //add siamese list
        List<TreeNode> node7 = new List<TreeNode>();
        foreach (var item in siameseList)
        {
            node7.Add(new TreeNode(item.name));
        }

        TreeNode[] siamese = node7.ToArray();

        //cat breed
        TreeNode node4 = new TreeNode("Siamese", siamese);
        TreeNode node5 = new TreeNode("Tabby", tabby);
        TreeNode[] cat = new TreeNode[] { node4, node5 };

        //cat parent
        treeNode = new TreeNode("Cats", cat);
        treeView1.Nodes.Add(treeNode);

或者 使用 LINQ,您可以像这样创建树

        // Code Using Linq
        TreeNode husky = new TreeNode("Husky", huskyList.Select(x => new TreeNode(x.name)).ToArray());
        TreeNode chiwawa = new TreeNode("Chiwawa", chiwawaList.Select(x => new TreeNode(x.name)).ToArray());
        TreeNode Siamese = new TreeNode("Siamese", siameseList.Select(x => new TreeNode(x.name)).ToArray());
        TreeNode Tabby = new TreeNode("Tabby", tabbyList.Select(x => new TreeNode(x.name)).ToArray());
        //parent nodes
        treeView1.Nodes.AddRange(new[] {
            new TreeNode("Dog", new TreeNode[] { husky, chiwawa }),
            new TreeNode("Cat", new TreeNode[] { Siamese, Tabby })
            });

【讨论】:

  • 您可以使用TreeView.Nodes.AddRange 而不是最后两行。相当于BeginUpdate + 一对Nodes.Add + EndUpdate
  • @RezaAghaei 谢谢。答案已按您的预期进行编辑。为什么要添加范围? refer here
猜你喜欢
  • 2020-09-19
  • 2016-08-08
  • 2014-02-16
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2021-10-08
相关资源
最近更新 更多