Przypisanie obiektu A do obiektu B

0

Witam. Chciałbym zrobić uzupełnianie TreeView z poziomu innej klasy, stworzyłem taki kod, który zwraca mi całe TreeView ale gdy próbuje przypisać go do TreeView z formy to nic się nie dzieje. Patrząc podczas debugowania widać, że treeView1 ma przekazane nody ale ich po prostu nie pokazuje. Wiecie jak temu zaradzić? Z góry dzięki

        public System.Windows.Forms.TreeView FillInTreeView(string fileConfig)
        {
            System.Windows.Forms.TreeView tv = new System.Windows.Forms.TreeView();
            var node = new TreeNode();
            string[] folderNameSplit = fileConfig.Split('|');
            for (int a = 0; a < folderNameSplit.Length; a++)
            {
                var fileName = folderNameSplit[a].Substring(1, folderNameSplit[a].IndexOf("]", StringComparison.Ordinal) - 1);
                node.Text = fileName;
                fileConfig = folderNameSplit[a].Substring(folderNameSplit[a].IndexOf("]", StringComparison.Ordinal) + 1);
                string[] result = fileConfig.Split('/');
                for (int b = 0; b < result.Length; b++)
                {
                    node.Nodes.Add(node.Text, result[b]);
                }
                tv.Nodes.Add(node);
                node.Nodes.Clear();
            }

            return tv;
        }
Obiekt do obiektu treeView1 = FillInTreeView("");
0

Troche to dziwnie wyglada. Skoro metoda nazywa sie FillInTreeView to powinna to drzewo wypelniac, a nie tworzyc nowe. Czyli mozna to zrobic tak, ze przekazujesz referencje, ktora pozniej odpowiednio wypelniasz. Wtedy metoda moze wygladac tak:

        public void  FillInTreeView(System.Windows.Forms.TreeView tv, string fileConfig)
        {
            var node = new TreeNode();
            string[] folderNameSplit = fileConfig.Split('|');
            for (int a = 0; a < folderNameSplit.Length; a++)
            {
                var fileName = folderNameSplit[a].Substring(1, folderNameSplit[a].IndexOf("]", StringComparison.Ordinal) - 1);
                node.Text = fileName;
                fileConfig = folderNameSplit[a].Substring(folderNameSplit[a].IndexOf("]", StringComparison.Ordinal) + 1);
                string[] result = fileConfig.Split('/');
                for (int b = 0; b < result.Length; b++)
                {
                    node.Nodes.Add(node.Text, result[b]);
                }
                tv.Nodes.Add(node);
                node.Nodes.Clear();
            }

            return tv;
        }
FillInTreeView(treeView1, "");

Jednak tutaj robisz bardzo zla rzecz - mieszasz logike UI z logiką flaków pod spodem. Ja bym to zrobił tak, że przygotowałbym jakiś model danych pod to drzewo, przygotował sobie w jakims osobnym miejscu i potem tylko pobindował odpowiednio

0

Dzięki wielkie, teraz działa fajnie :P. Jeżeli masz ochotę to możesz zademonstrować jak zrobiłbyś to, chętnie obejrzałbym

0

Twoja metoda wywala się dla konfiga:
"[conf_1]123/456/789|[conf_2]987/654/321|[conf_3]abc/def/ghi"
Nawet gdyby się nie wywalała zwróciła by tylko następującą strukturę:

conf3
|-abc
|-def
|-ghi

Nawet bez separacji da się ten kod napisać czytelniej (przy okazji poprawiłem błąd)

tv.Nodes.Clear();
            
            string[] folderConfigs = fileConfig.Split('|');
            foreach (var folderConfig in folderConfigs)
            {
                string[] folderConfigSplit = folderConfig.Split(']');

                var folderTreeNode = new TreeNode();
                string fileName = folderConfigSplit[0].Remove(0, 1);

                folderTreeNode.Text = fileName;

                string[] details = folderConfigSplit[1].Split('/');

                foreach (var detail in details)
                {
                    var detailNode = new TreeNode();
                    detailNode.Text = detail;
                    folderTreeNode.Nodes.Add(fileName, detail);
                }

                tv.Nodes.Add(folderTreeNode);
            }

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