NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Ladislav Niderle:5.1.2016 6:24

Ahoj, potřeboval bych poradit jak v c# smazat správně vybraný node.
Příklad:

Node1
NodeA1
NodeA2
Node2
NodeB1
NodeB2

Když označím NodeA2 a stisknu tlačítko smazat, tak bych rád, aby se smazalo, ale ještě předtím potřebuji vytáhnout informaci, kterou jsem při zápisu dal do Tag.
Může mi s tím někdo poradit?
Já předpokládal původně, že použiji následující:

foreach(Node node in TreeView1.SelectedNodes)
{
        string informace = node.Tag;
        TreeView1.Nodes.Remove(node);
        ...
}

Ale ani jedno z těch dvou mi nefunguje. Může mi prosím někdo poradit?

Předem moc děkuji

 
Odpovědět
5.1.2016 6:24
Avatar
Odpovídá na Ladislav Niderle
Martin Turner:5.1.2016 6:52

Ahoj,

máš jistotu, že TreeView1.Selec­tedNodes opravdu něco obsahuje?
S TreeView nemám moc zkušeností, ale není potřeba při změně provést nějaké překreslení (redrawing) nebo update stromu?
Pokud na něco přijdeš, dej vědět, rád se poučím. ;-)
Díky.

 
Nahoru Odpovědět
5.1.2016 6:52
Avatar
Ladislav Niderle:5.1.2016 7:00

Ahoj, ano vím s jistotou, že v TreeView1.Selec­tedNodes něco najdu. To mám ošetřeno a ano potom se musí udělat update a refresh co jsem zatím byl schopen zjistit, ale já mám problém, že mi to spadne na chybu : "Zadanou položku nelze odebrat, protože položka nebyla v určené kolekci nalezena." Takže problém bude někde v tom, že nevím zda odstraňuji první úroveň nebo druhou a u toho vím s jistotou že více úrovní ani nebude.

 
Nahoru Odpovědět
5.1.2016 7:00
Avatar
D0ll0k
Člen
Avatar
D0ll0k:5.1.2016 22:16

Jseš jsi jistý, že: treeview.Selec­tedNodes máš správně? Pokud vím, tak existuje jen: treeview.Selec­tedNode, která vrací TreeNode.

Nahoru Odpovědět
5.1.2016 22:16
Veni, vidi, programmato
Avatar
Ladislav Niderle:6.1.2016 8:31

Máš pravdu že standartní nemá, ale já využívám devcomponents a ten to má, ale nakonec jsem tomu ustoupil a prostě uživatel bude muset mazat po jednom. Jinak jsem to nakonec vyřešil tím, že mám následující kód:

Node node = treeview1.SelectedNode;
Node parents = node.Parent;
if (parents == null)
{
        treeview1.Nodes.Remove(node);
}
else
{
        parents.Nodes.Remove(node);
}
treeview.Update();
treeboew.Refresh();

s tímto mi to již funguje.

Jediný další problém mám v tom, že následně procházím kolekci, kde se snažím smazat požadovaný výskyt a ten mi spadne na chybu, jelikož ten první výskyt smažu, ale pro další průchod mi to napíše:
Kolekce byla upravena. Operace výčtu pravděpodobně nebude spuštěna.

S tím si ale zatím nevím rady. Tak pokud by někdo věděl co je v tomto k=odu špatně, tak budu jedině rád:

foreach (var radek in _data)
                {
                    if (string.IsNullOrWhiteSpace(druhy))
                    {
                        if (Piece.SharedTheFunction.DPiece(radek.Klic, "|", 1, "") != prvni) continue;
                        _data.Remove(radek);
                        continue;
                    }
                    if (radek.Klic != guids) continue;
                    _data.Remove(radek);
                }
 
Nahoru Odpovědět
6.1.2016 8:31
Avatar
D0ll0k
Člen
Avatar
Odpovídá na Ladislav Niderle
D0ll0k:6.1.2016 23:58

Chybu ti to hází, protože jsi upravil ve foreach kolekci _data metodou _data.Remove(ra­dek), jak ti to píše visual studio. Aby jsi se tomu vyhnul, vytvoř si ještě jednu kolekci (třeba prvkyProSmazani) stejného datového typu jako _data. A místo:

_data.Remove(radek);

si radek vloz do druhe kolekce:

prvkyProSmazani.Add(radek);

Pak ji stačí projet foreachem a smazat prvky v _data:

foreach(var prvekProSmazani in prvkyProSmazani)
{
    _data.Remove(prvekProSmazani):
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
6.1.2016 23:58
Veni, vidi, programmato
Avatar
Odpovídá na D0ll0k
Ladislav Niderle:7.1.2016 7:20

Moc děkuji, udělal jsem to jak jsi psal a už je to v pořádku. mi to nedošlo, že je v tomto problém, ale nakonec to dává přeci jenom smysl :)

 
Nahoru Odpovědět
7.1.2016 7:20
Avatar
krepsy3
Tvůrce
Avatar
Odpovídá na Ladislav Niderle
krepsy3:7.1.2016 17:09

Je pěkné poděkovat, ale je také slušné označit řešení, aby bylo jasné, že je vše v pořádku, lidi mohli nejlepší odpověď (tedy řešení) použít a vlákno se uzavřelo ;)

Nahoru Odpovědět
7.1.2016 17:09
Programátor je stroj k převodu kávy na kód.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.