Article View: alt.pl.comp.lang.csharp
Article #10042Re: Zachowanie stanu w TreeView
From: Tomasz Muszyński
Date: Fri, 18 Nov 2005 00:01
Date: Fri, 18 Nov 2005 00:01
57 lines
4020 bytes
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-mailReferences:
<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