🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: alt.pl.comp.lang.csharp
Article #10042

Re: Zachowanie stanu w TreeView

#10042
From: Tomasz Muszyński
Date: Fri, 18 Nov 2005 00:01
57 lines
4020 bytes
NoCode napisał(a):
> Użytkownik "Tomasz Muszyński"  napisał w wiadomości
>> A ja za to robię sobie HashTable do wszystkich węzłów drzewa i wtedy 
>> bardzo szybko moge znaleźć interesujący mnie węzeł - oczywiście 
>> potrzebny jest jakiś klucz, np guid albo primary key.
> 
> 
> I owszem, nikt nie zprzecza, ze trzeba te dane gdzies zachowac. Ale czy 
> nie lepiej zwykly ArrayList ? Po co ci zachowanie danych jako 
> klucz-wartosc ?

Dzięki HashTable mozesz powiązać węzły z jakimś kluczem - zazwyczaj 
elementy drzewa jakiś posiadają. Możesz pobawić się na ArrayList, ale 
chyba efektywność będzie zerowa.

>> Jeśli chcesz zapamiętać otwarte węzły to można przy evencie OnExpand 
>> mozna dodawać takie węzły do innej HashTable a OnCollapse usuwać je - 
>> nie jest to jednak konieczne, bo z HashTable wszystkich węzłów łatwo 
>> przejść po wszystkich i sprawdzić, który jest otwarty.
> 
> Jak byc mogl to troche rozwinac... Czy w HashTablu chcesz trzymac 
> referencje do wezlow ? Bo wiesz, w zalozeniu problemu lezy sytuacja, w 
> ktorej nastepuje calkowite przebudowanie wszystkich wezlow po 
> aktualizacji (obiekty zostana zniszczone, a na ich miejsce wyrysowane 
> nowe).

Czy napisałem, ze masz zserializować te węzły?

Tworzysz sobie HashTable otwartych elementów na OnExpand. Przy każdym 
OnExpand powinieneś przeszukiwać wezły po treenode.Parent celem 
usunięcia z owej listy wszystkich rodziców tego węzła, gdyż nie będą nam 
takie informacje potrzebne (zapamiętujemy tylko ten najbardziej 
zagnieżdżony). OnCollapse za to usuwasz ten węzeł z listy, a 
zapamiętujesz treenode.Parent (jesli juz nie był wcześniej zapamiętany). 
Tu właśnie pomaga przypisanie każdemu węzłowi jakiegoś klucza, hasha, 
guida lub czegokolwiek unikalnego aby szybko dało się odszukać go w 
HashTable. Klucz ten mozesz sobie zapamiętać w treenode.Tag.

W celu zapamiętania stanu otwartych węzłów zapisujesz więc tylko klucze 
znajdujące się w tej HashTable.

Kiedy chcesz natomiast zbudować nowe drzewo i otworzyć zapamiętane 
elementy to budując od zera nowe drzewo sprawdzasz w zapamiętanej liście 
czy dany klucz był zapamiętany czy nie. Aha, Expand() na zagniezdzonym 
węźle nie otworzy jego rodziców, robi to EnsureVisible() ale w naszym 
przypadku jego wadą jest skakanie do otwieranego węzła, więc znowu, w 
pętli idąc po treenode.Parent wywolujesz Expand() na kazdym węźle, który 
nie jest treenode.IsExpanded. Odbudowując drzewo i robiąc Expand() znowu 
zapamiętujesz otwarte węzły w HashTable, celem ich ewentualnego 
ponownego zapamiętania.

 > Mi zalezy na kodzie, ktory w pelni odtworzy wszystkie rozwiniete wezly
 > po odrysowaniu ich (usunieciu i ponownym utworzeniu).

Powyższe właśnie zrobi to co chcesz.

tm
Technical Details
Message-ID: <dlj5n4$94h$1@atlantis.news.tpi.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed.tpinternet.pl!nemesis.news.tpi.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
References: <dlf3ot$gkm$1@inews.gazeta.pl> <dlf5vq$ahk$1@nemesis.news.tpi.pl> <dlg7sm$mf5$1@inews.gazeta.pl> <dlgcmv$4tr$1@atlantis.news.tpi.pl> <dlgfp1$eqo$1@nemesis.news.tpi.pl> <dlggsr$459$1@inews.gazeta.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.nask.pl!news.nask.org.pl!newsfeed.tpinternet.pl!nemesis.news.tpi.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mail
From: Tomasz Muszyński <thom_ek@op.pl_nospam>
Newsgroups: alt.pl.comp.lang.csharp
Subject: Re: Zachowanie stanu w TreeView
Date: Fri, 18 Nov 2005 01:01:49 +0100
Organization: tp.internet - http://www.tpi.pl/
Lines: 57
Message-ID: <dlj5n4$94h$1@atlantis.news.tpi.pl>
References: <dlf3ot$gkm$1@inews.gazeta.pl> <dlf5vq$ahk$1@nemesis.news.tpi.pl> <dlg7sm$mf5$1@inews.gazeta.pl> <dlgcmv$4tr$1@atlantis.news.tpi.pl> <dlgfp1$eqo$1@nemesis.news.tpi.pl> <dlggsr$459$1@inews.gazeta.pl>
NNTP-Posting-Host: dmo46.neoplus.adsl.tpnet.pl
Mime-Version: 1.0
X-Trace: atlantis.news.tpi.pl 1132272165 9361 83.24.70.46 (18 Nov 2005 00:02:45 GMT)
X-Complaints-To: usenet@tpi.pl
NNTP-Posting-Date: Fri, 18 Nov 2005 00:02:45 +0000 (UTC)
User-Agent: Mozilla Thunderbird 1.0.2 (Windows/20050317)
X-Accept-Language: pl, en-us, en
In-Reply-To: <dlggsr$459$1@inews.gazeta.pl>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit