TreeView létrehozás string tömbből
2020-07-12T20:53:38+02:00
2020-07-13T11:03:59+02:00
2022-08-11T20:55:32+02:00
SuhiZ
Szaisztok!

Egy kis segítséget szeretnék kérni. C#-ban winformban egy treeview-t szeretnék dinamikusan feltölteni string tömbökből. A tömbök az alábbiakhoz hasonlóan néznek ki.

["Root0"] ["Root0", "Node2"] ["Root0", "Node1", "Node1_2"] ["Root0", "Node1", "Node1_3"] ["Root0", "Node1", "Node1_1", "Node1_1_1"] ["Root0", "Node1", "Node1_1", "Node1_1_2"] ["Root0", "Node3", "Node3_1", "Node3_1_1"]
Az a problémám, hogy a bárhogy csinálom minden child elem a root alá kerül közvetlenül. Hálás lennék, ha valaki tudna nekem segíteni, hogy ezt, hogy lehet megvalósítani. A cél a csatolt fájlban látható.
Mutasd a teljes hozzászólást!
Csatolt állomány
Kicsit nézegetve a doksit, szerintem túlbonyolítod az életedet. A fában a node-oknak nevet is lehet adni, nem csak megjelenítendő szöveget. Amint adsz nekik nevet, egyből lehet őket név szerint keresni, nem kell saját ciklust írni rá.

A másik, hogy se a TopNode property, se a SelectedNode property nem azt csinálják, amire te próbálod használni őket, amit a dokumentáció egyértelműen le is ír. (Elolvastad ugye, nem csak rámondtad hogy nem világos?)

Én így közelíteném meg, de lusta vagyok köréírni kódot, hogy élesben is kipróbáljam:

private void Proba() { List<string[]> elemList = JsonConvert.DeserializeObject<List<string[]>>(File.ReadAllText(@"treeSample.txt")); tv.Nodes.Clear(); foreach (string[] elem in elemList) { TreeNodeCollection currentParent = tv.Nodes; foreach (string pathSegment in elem) { TreeNode[] childrenWithThisName = currentParent.Find(pathSegment, false); if (childrenWithThisName.Length > 0) { currentParent = childrenWithThisName[0].Nodes; } else { TreeNode newChild = currentParent.Add(pathSegment, pathSegment); currentParent = newChild.Nodes; } } } }
Ennek annyi hátránya van, hogy a doksi szerint a TreeNodeCollection nem veszi figyelembe a kis-és nagybetűt a kulcsok keresésénél. Ha neked a JSON-ban fontos ezeket megkülönböztetni, akkor kénytelen leszel a Find hívása helyett saját ciklusban keresni, akár név, akár szöveg alapján.
Mutasd a teljes hozzászólást!

  • Az a problémám, hogy a bárhogy csinálom minden child elem a root alá kerül közvetlenül.

    Nos. Szerintem be kéne mutatnod, hogyan is próbálkoztál, mert szerintem a dokumentáció eléggé egyértelmű...
    Mutasd a teljes hozzászólást!
  • Szerintem erre a problémára nem annyira egyértelmű, aztán lehet, hogy csak én nem látom a fától az erdőt.

    
    private void Proba()
    {
    var sTomb = JsonConvert.DeserializeObject<List<string[]>>(File.ReadAllText(@"treeSample.txt"));
    tv.Nodes.Clear();
    tv.SelectedNode = tv.TopNode;
    foreach (var sT in sTomb)
    {
    tv.SelectedNode = tv.TopNode;
    for (int i = 0; i < sT.Length; i++)
    {
    string s = sT
    ;
     
    TreeNode tn = new TreeNode(s);
     
    if (tv.SelectedNode != null)
    {
    if (!GetNode(tv.SelectedNode.Nodes, s))
    {
    tv.SelectedNode.Nodes.Add(tn);
    }
    tv.SelectedNode = tn;
    }
    else
     
    {
    tv.Nodes.Add(tn);
    tv.SelectedNode = tn;
    }
    }
    }
    }
    private bool GetNode(TreeNodeCollection nodes, string text)
    {
    foreach (TreeNode item in nodes)
    {
    if (item.Text == text)
    {
    return true;
    }
    }
    return false;
    }





    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Kicsit nézegetve a doksit, szerintem túlbonyolítod az életedet. A fában a node-oknak nevet is lehet adni, nem csak megjelenítendő szöveget. Amint adsz nekik nevet, egyből lehet őket név szerint keresni, nem kell saját ciklust írni rá.

    A másik, hogy se a TopNode property, se a SelectedNode property nem azt csinálják, amire te próbálod használni őket, amit a dokumentáció egyértelműen le is ír. (Elolvastad ugye, nem csak rámondtad hogy nem világos?)

    Én így közelíteném meg, de lusta vagyok köréírni kódot, hogy élesben is kipróbáljam:

    private void Proba() { List<string[]> elemList = JsonConvert.DeserializeObject<List<string[]>>(File.ReadAllText(@"treeSample.txt")); tv.Nodes.Clear(); foreach (string[] elem in elemList) { TreeNodeCollection currentParent = tv.Nodes; foreach (string pathSegment in elem) { TreeNode[] childrenWithThisName = currentParent.Find(pathSegment, false); if (childrenWithThisName.Length > 0) { currentParent = childrenWithThisName[0].Nodes; } else { TreeNode newChild = currentParent.Add(pathSegment, pathSegment); currentParent = newChild.Nodes; } } } }
    Ennek annyi hátránya van, hogy a doksi szerint a TreeNodeCollection nem veszi figyelembe a kis-és nagybetűt a kulcsok keresésénél. Ha neked a JSON-ban fontos ezeket megkülönböztetni, akkor kénytelen leszel a Find hívása helyett saját ciklusban keresni, akár név, akár szöveg alapján.
    Mutasd a teljes hozzászólást!
  • Köszönöm a segítséget, hát rendesen bevittem magam az erdőbe.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd