Diskuze: c# treeview smazat node

C# .NET .NET (C# a Visual Basic) c# treeview smazat node American English version English version

Avatar
niderle.l
Člen
Avatar
niderle.l:

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. ledna 6:24
Avatar
Odpovídá na niderle.l
Martin Turner:

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. ledna 6:52
Avatar
niderle.l
Člen
Avatar
niderle.l:

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. ledna 7:00
Avatar
D0ll0k
Člen
Avatar
D0ll0k:

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. ledna 22:16
Ten, co se snaží "programovat"
Avatar
niderle.l
Člen
Avatar
niderle.l:

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. ledna 8:31
Avatar
D0ll0k
Člen
Avatar
Odpovídá na niderle.l
D0ll0k:

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í
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 6. ledna 23:58
Ten, co se snaží "programovat"
Avatar
niderle.l
Člen
Avatar
Odpovídá na D0ll0k
niderle.l:

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. ledna 7:20
Avatar
krepsy3
Redaktor
Avatar
Odpovídá na niderle.l
krepsy3:

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. ledna 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.