[ASP.net/C#] TreeView repopulate niet

Pagina: 1
Acties:

  • Intrepidity
  • Registratie: December 2003
  • Laatst online: 24-06-2024
Ik heb een ASP.net pagina met hierin een treeview. Het inladen van de hele treeview duurt erg lang en genereert enorme lappen HTML (1 root met ongeveer 800 nodes). Daarom wil ik de tree op beginletter gaan filteren. Ik heb bovenaan mijn pagina een usercontrol neergezet met hierin een stel linkbuttons, die elk een letter voorstellen.
Wat ik nu dus wil doen is de tree repopulaten. De eventhandler die hierbij normaal gesproken aangeroepen word (TreeNodePopulate) haalt de geselecteerde beginletter op en geeft dit mee aan een andere functie die nodes ophaalt dmv een SP (in een MSSQL database).

Ik krijg het niet voor elkaar om de tree te verversen op dit punt. Zodra ik een linkbutton aanklik postbackt de hele pagina (wordt in de toekomst nog ajax-achtig opgelost, maar eerst maar even zo werkend krijgen), en wat mij dus logisch lijkt is dat de rootnode zichzelf moet gaan populaten, maar dit event word nooit geraised.

Via google heb ik gevonden dat dit komt omdat de hele tree als het ware gecached word in de viewstate. Klopt dit, en hoe kan ik zorgen dat mijn treeview netjes gefilterd getoond word?
Het uitzetten van "EnableViewstate" op de treeview-control geeft ongewenste resultaten waarin de tree soms leeg is, en op andere momenten komt er wel de juiste selectie, maar dan pas als je al op een andere letter geklikt hebt.

Alvast bedankt voor de hulp :)

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 11-11 10:24

Bosmonster

*zucht*

800 nodes valt toch wel mee? Even uitgaande dat het wel logische HTML genereert met ul/li.

Anders kun je ook nog de nodes pas inladen als je ze openklikt natuurlijk.

[ Voor 30% gewijzigd door Bosmonster op 23-05-2008 13:55 ]


  • Intrepidity
  • Registratie: December 2003
  • Laatst online: 24-06-2024
Bosmonster schreef op vrijdag 23 mei 2008 @ 13:55:
800 nodes valt toch wel mee? Even uitgaande dat het wel logische HTML genereert met ul/li.

Anders kun je ook nog de nodes pas inladen als je ze openklikt natuurlijk.
Het is gewoon de standaard ASP.net treeview control, die genereert een lap HTML van ongeveer 0.9MB met 800 nodes, en dat laadt gewoon te langzaam. En die 800 nodes zitten wel allemaal op hetzelfde niveau, dus direct onder de root, de rest van de niveau's (nog dieper) worden inderdaad gewoon on-demand ingeladen.. (1e niveau ook, maar de root is by default al opengeklapt als de pagina geopend word)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:52

gorgi_19

Kruimeltjes zijn weer op :9

Als je viewstate uitzet, moet je hem in iedere request opnieuw populaten. En waarom wordt hij niet aangeroepen? Heb je hem wel koppeld aan een event? Of voert hij de code niet uit? Heb je al gekeken wat er precies gebeurd?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Intrepidity
  • Registratie: December 2003
  • Laatst online: 24-06-2024
gorgi_19 schreef op vrijdag 23 mei 2008 @ 14:35:
Als je viewstate uitzet, moet je hem in iedere request opnieuw populaten. En waarom wordt hij niet aangeroepen? Heb je hem wel koppeld aan een event? Of voert hij de code niet uit? Heb je al gekeken wat er precies gebeurd?
Hij is wel goed gekoppeld aan het event. Eerste keer dat de pagina geladen word word hij aangeroepen (gechecked dmv een breakpoint), na het kiezen van een beginletter niet meer..

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:52

gorgi_19

Kruimeltjes zijn weer op :9

De viewstate heb je niet uitgezet? Je koppelt je event niet dynamisch aan de control? Je voegt geen dynamische controls toe die je controlcollection om zeep helpen? Je roept nadien ook niet nogmaals een databind aan op de betreffende control?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Intrepidity
  • Registratie: December 2003
  • Laatst online: 24-06-2024
gorgi_19 schreef op vrijdag 23 mei 2008 @ 14:42:
De viewstate heb je niet uitgezet? Je koppelt je event niet dynamisch aan de control? Je voegt geen dynamische controls toe die je controlcollection om zeep helpen? Je roept nadien ook niet nogmaals een databind aan op de betreffende control?
Viewstate staat nu aan, en het event word gekoppeld door een property in de asp-tag van de treeview. Verder doe ik geen gekke dingen. Nog een keer een databind forceren op die control heb ik geprobeerd nav een tip op google, maar dit maakte niks uit, dus heb ik weer weggehaald..
Die usercontrol die het selecteren van een letter mogelijk maakt is wel dynamisch, er worden in een for-loop 26 linkbuttons toegevoegd aan die control, maar daar lijkt me het probleem niet te liggen, dat ligt eerder in de treeview (waarde van die AlphabeticList is wel goed op te halen enzo)

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 11-11 10:24

Bosmonster

*zucht*

Intrepidity schreef op vrijdag 23 mei 2008 @ 14:05:
[...]

Het is gewoon de standaard ASP.net treeview control, die genereert een lap HTML van ongeveer 0.9MB met 800 nodes, en dat laadt gewoon te langzaam.
Ow ja, ASP.NET, what was I thinking..

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:52

gorgi_19

Kruimeltjes zijn weer op :9

Intrepidity schreef op vrijdag 23 mei 2008 @ 14:47:
Die usercontrol die het selecteren van een letter mogelijk maakt is wel dynamisch, er worden in een for-loop 26 linkbuttons toegevoegd aan die control, maar daar lijkt me het probleem niet te liggen, dat ligt eerder in de treeview (waarde van die AlphabeticList is wel goed op te halen enzo)
* gorgi_19 gokt dat het hier wel aan ligt. Probeer voor de grap maar eens een linkbutton via de normale manier toe te voegen met de letter E oid. * gorgi_19 gokt dat het dan wel werkt. Dynamische controls hebben wat aparte eigenschappen :)
Bosmonster schreef op vrijdag 23 mei 2008 @ 14:47:
[...]


Ow ja, ASP.NET, what was I thinking..
Met een repeater kan je nog steeds nette HTML genereren :)

[ Voor 14% gewijzigd door gorgi_19 op 23-05-2008 14:51 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • IJsbeer
  • Registratie: Juni 2001
  • Niet online
Maak gebruik van de CSS Control Adapters, scheelt iig al een hoop HTML :)

En boven aan in je pagina staat AutoEventWireup="true" toch wel aan?

DataBind zou ik gewoon in de page_load doen.

  • Intrepidity
  • Registratie: December 2003
  • Laatst online: 24-06-2024
gorgi_19 schreef op vrijdag 23 mei 2008 @ 14:50:
[...]

* gorgi_19 gokt dat het hier wel aan ligt. Probeer voor de grap maar eens een linkbutton via de normale manier toe te voegen met de letter E oid. * gorgi_19 gokt dat het dan wel werkt. Dynamische controls hebben wat aparte eigenschappen :)
Blijkbaar niet.. heb die control vervangen door een doodgewone linkbutton.. Nog steeds ziet de pagina de noodzaak niet om de tree te herpopulaten.. Heb het nog geprobeerd om het te forceren door de rootnode weg te gooien en een nieuwe toe te voegen, dit raised wel het juiste event op de treeview, maar te vroeg.. nog voordat de eventhandler van de linkbutton is aangeroepen :'(
Dus nou doet 'ie het in principe wel maar heeft ie te laat de juiste waarde om te filteren
Node deleten+toevoegen in de eventhandler van de linkbutton zelf werkt ook voor geen meter

  • Intrepidity
  • Registratie: December 2003
  • Laatst online: 24-06-2024
Even een post-weekend schopje, zit nog steeds met dit probleem

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Als je toch dynamisch je treeview aan wilt maken is het misschien een goed moment om dat in de CreateChildControls van je Page te doen. Volgens mij zijn hiervoor al de eventhandlers van je (andere) controls afgegaan.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 17-11 13:12

sopsop

[v] [;,,;] [v]

gorgi_19 schreef op vrijdag 23 mei 2008 @ 14:50:
[...]
Met een repeater kan je nog steeds nette HTML genereren :)
Dat kan ook met een treeview, alleen moet je dan zelf wat doen. Niet eens heel veel trouwens. Of je gebruikt een control adapter.

  • Intrepidity
  • Registratie: December 2003
  • Laatst online: 24-06-2024
Volgensmij word bij een postback de CreateChildControls al gecalled voor de PageLoad, en andersom als je de pagina voor de eerste keer laad.. dus ik denk niet dat dat zin gaat hebben in mijn geval.
Ik zal er evengoed eens wat documentatie over opzoeken :)

  • Intrepidity
  • Registratie: December 2003
  • Laatst online: 24-06-2024
Het is uiteindelijk gelukt door de tree helemaal leeg te gooien en opnieuw te vullen met een rootnode, die zichzelf gelukkig gaat populaten op dat moment :) Had deze aanpak al eens eerder geprobeerd, maar blijkbaar toch iets foutgedaan toen..
Op het moment dat je nu een letter selecteert word het volgende gedaan:

C#:
1
2
3
4
5
6
7
8
9
string value = geodata.nivo_nr.ToString() + "," + geodata.uli_nr.ToString();
TreeNode rootNode = new TreeNode(geodata.uli_naam, value);
rootNode.SelectAction = TreeNodeSelectAction.SelectExpand;
rootNode.PopulateOnDemand = true;

tvGeostructuur.Nodes.Clear();
tvGeostructuur.Nodes.Add(rootNode);
tvGeostructuur.Nodes[0].Select();
tvGeostructuur.Nodes[0].Expand();


Bedankt voor de hulp :)

  • Tom
  • Registratie: Juni 1999
  • Niet online

Tom

Of anders RAD Treeview gebruiken.
http://www.telerik.com/pr...ls/treeview/overview.aspx
Die kun je via AJAX de onderliggende nodes laten ophalen, pas op het moment dat het nodig is (bij het openklappen dus). Zit dan wel iets vertraging in maar lost je probleem wel op :)
Het is alleen wel een commercieel component, maar je kunt een demo (werkt volledig onder localhost) wel uitproberen.

  • Intrepidity
  • Registratie: December 2003
  • Laatst online: 24-06-2024
Tom schreef op dinsdag 27 mei 2008 @ 09:21:
RAD Treeview gebruiken.
http://www.telerik.com/pr...ls/treeview/overview.aspx
Die kun je via AJAX de onderliggende nodes laten ophalen, pas op het moment dat het nodig is (bij het openklappen dus). Zit dan wel iets vertraging in maar lost je probleem wel op :)
Het is alleen wel een commercieel component, maar je kunt een demo (werkt volledig onder localhost) wel uitproberen.
We hebben de telerik controls beschikbaar inderdaad, maar het ombouwen van die hele app had teveel tijd gekost, en de standaard .net control voldoet momenteel prima :) Alle sjieke features als drag-and-drop hebben we toch niet nodig, en de .net control kan zichzelf ook via ajax populaten

  • Tom
  • Registratie: Juni 1999
  • Niet online

Tom

OK mooi :)
Pagina: 1