treeview problem z gałęziami

0

Cześć,

Na projekt do uczelni potrzebuje wykorzystać kontrolkę treeview do przedstawienia danych. Struktura danych ma wyglądać tak:

Name1, Level 0
Name2, Level 1
Name3, Level 1
Name4, Level 2
Name4+, Level 3
Name5, Level 2
Name5+, Level 3
Name6, Level 0

Czyli mój treeview powinien wyglądać tak:

+---Name1
|   |
|   +------Name2
|   |
|   +------Name3
|          |
|          +------Name4
|          |      |
|          |      +------Name4+
|          |
|          +------Name5
|                 |
|                 +------Name5+
|
+---Name6

Zapytałem się wujka Google, pokombinowałem i napisałem coś takiego:

        public class TreeItem
        {
            public string Name;
            public int Level;
            public TreeItem(string name, int level)
            {
                Name = name; Level = level;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            List<TreeItem> items = new List<TreeItem>();
            items.Add(new TreeItem("Name1", 0));
            items.Add(new TreeItem("Name2", 1));
            items.Add(new TreeItem("Name3", 1));
            items.Add(new TreeItem("Name4", 2));
            items.Add(new TreeItem("Name4+", 3));
            items.Add(new TreeItem("Name5", 2));
            items.Add(new TreeItem("Name5+", 3));
            items.Add(new TreeItem("Name6", 0));
            PopulateTree(treeView1, items);
        }

        public static void PopulateTree(TreeView tree, ICollection<TreeItem> items)
        {
            tree.Nodes.Clear();
            List<TreeNode> roots = new List<TreeNode>();
            roots.Add(tree.Nodes.Add("Items"));
            foreach (TreeItem item in items)
            {
                if (item.Level == roots.Count) roots.Add(roots[roots.Count - 1].LastNode);
                roots[item.Level].Nodes.Add(item.Name);
            }
        }
 

Ale niestety, mój treeview wygląda nico inaczej niż zakładałem. Dokładanie tak:

+---Name1
|   |
|   +------Name2
|   |
|   +------Name3
|          |
|          +------Name4
|          |      |
|          |      +------Name4+
|          |      |
|          |      +------Name5+
|          |
|          +------Name5
|
+---Name6

Szukam, szukam i nie mogę znaleźć błędu. Bardzo proszę o pomoc, bo utknąłem w martwym punkcie.
Z góry bardzo dziękuje.

Adam

0

dodajesz "Name5+" z indeksem 3. trzecim dodanym elementem (licząc od zera!) jest "Name4", więc w pełni prawidłowo "Name5+" jest dzieckiem "Name4".
próbowałeś zmienić wartość jakiegokolwiek indeksu? próbowałeś zrozumieć, jak to działa? w życiu nie korzystałem z TreeView pod C#, a dam sobie rękę uciąć, że wystarczy zmienić items.Add(new TreeItem("Name5+", 3)); na items.Add(new TreeItem("Name5+", 5));

0
ŁF napisał(a)

a dam sobie rękę uciąć, że wystarczy zmienić items.Add(new TreeItem("Name5+", 3)); na items.Add(new TreeItem("Name5+", 5));

No to nie miałbyś teraz ręki :)
Zrobiłem tak jak mówisz i to co dostałem wygląda tak:

 

+---Name1
    |
    +------Name2
    |
    +------Name3
           |
           +------Name4
           |      |
           |      +------Name4+
           |      |
           |      +------Name5+
           |
           +------Name5


Próbowałem to zrozumieć i kombinowałem na milion różnych sposobów. Jeżeli udałoby mi się to, nie pisałbym tutaj....

0

A czytałeś jakąś dokumentację? Nie wierzę, żeby nigdzie nie było instrukcji jak to zrobić.

0
somekind napisał(a)

A czytałeś jakąś dokumentację? Nie wierzę, żeby nigdzie nie było instrukcji jak to zrobić.

Oczywiście, że czytałem. Ale nic sensownego nie wymyśliłem, dlatego tutaj jestem.

0

straciłbym rękę, bo nawet nie zauważyłem, że TreeItem to Twoja klasa ;]
więc teraz na poważnie, z kompilatorem pod ręką: nie zbudujesz drzewiastej struktury w taki sposób, a przynajmniej będzie to dużo trudniejsze niż to, co zrobiłeś. tu masz poprawnie działającą rekurencyjną metodę:
public partial class Form1 : Form
{
public class TreeItem
{
public string Name;
public TreeItem[] Nodes;

		public TreeItem(string name, params TreeItem[] children)
		{
			Name = name;
			Nodes = children;
		}
	}

	private void Form1_Load(object sender, EventArgs e)
	{
		TreeItem[] items = new TreeItem[]
		{
			new TreeItem("Name1",
				new TreeItem("Name2", null),
				new TreeItem("Name3",
					new TreeItem("Name4", 
						new TreeItem("Name4+", null)
					),
					new TreeItem("Name5",
						new TreeItem("Name5+", null)
					)
				),
				new TreeItem("Name6", null)
			)
		};
		
		PopulateTree(treeView1.Nodes, items);
		treeView1.ExpandAll();
	}


	public static void PopulateTree(TreeNodeCollection nodes, TreeItem[] children)
	{
		foreach (var child in children)
		{
			TreeNode node = nodes.Add(child.Name);
			if (child.Nodes != null)
				PopulateTree(node.Nodes, child.Nodes);
		}
	}

	
	public Form1()
	{
		InitializeComponent();
	}

}
0
ŁF napisał(a)

tu masz poprawnie działającą rekurencyjną metodę:

Prześlicznie dziękuje. Wszystko działa jak należy. Super.

1 użytkowników online, w tym zalogowanych: 0, gości: 1