Toon posts:

[ASP.NET] Datagrid in Dynamisch UserControl ViewState

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een DataGrid aan een Dynamisch opgebouwd UserControl. Dus ik laad het UserControl afhankelijk van de keuze van de gebruiker.

Nu heb ik het probleem dat als ik een item uit de DataGrid wil editten, dat de EditItemIndex op het moment dat er op Update wordt geklikt niet wordt teruggezet naar de waarde van het item dat ge-edit wordt, en dat het UpdateCommand niet wordt uitgevoerd.

Ik heb een tijdje lopen debuggen, en ik heb de volgende 2 schema's naast elkaar gezet.

Bij een pagina waar de UserControl niet dynamisch is, als je op Update klikt van rij 0:
code:
1
2
3
4
5
1. Init van de .ascx (EditItemIndex: -1)
2. Init van de .aspx (EditItemIndex: -1)
3. PageLoad .aspx (EditItemIndex: 0)
4. PageLoad .aspx (EditItemIndex: 0)
5. UpdateComand .ascx  (EditItemIndex: 0)


Als ik dit nu doe bij een pagina waarin de UserControl in de PageLoad van de .aspx wordt geladen:
code:
1
2
3
4
1. Init van de .aspx (EditItemIndex: null)
2. PageLoad .aspx (EditItemIndex: null)
    3. Init van de .ascx (EditItemIndex: -1) (tijdens PageLoad van .aspx)
4. PageLoad .ascx (EditItemIndex: -1)


Hierbij wordt dus de EditItemIndex niet ingesteld, omdat de ViewState volgens mij al tussen de Init en de PageLoad van de .aspx pagina wordt teruggezet, en daar bestaat de UserControl nog niet.

Laadt ik nu de UserControl in de Init, gebeurd het volgende:
code:
1
2
3
4
1. Init van de .aspx (EditItemIndex: null)
    2. Init van de .ascx (EditItemIndex: -1) (tijdens Init van .aspx)
3. PageLoad .aspx (EditItemIndex: -1)
4. PageLoad .ascx (EditItemIndex: -1)


Nu is de volgorde nagenoeg gelijk aan die van waarin het wel werkt (ik initialiseer de UserControl voordat ik de Init code van de .aspx pagina uitvoer) maar nogsteeds wordt de ViewState niet teruggezet.

De workaround die ik ervoor bedacht heb is de volgende: Het laden van de UserControl gebeurd in de PageLoad van de .aspx, en tijdens het EditCommand van de DataGrid set ik in de Sessie de EditItemIndex. Tijdens de PageLoad stel ik die weer in. Nu werkt het wel, maar ik kan me niet voorstellen dat dit de beste oplossing is.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Het is al tijd geleden dat ik nog eens wat met ASP.NET gedaan heb, maar moet je UserControl stuff niet in de PreRender oid afhandelen?

https://fgheysels.github.io/


Verwijderd

Topicstarter
In de PreRender schakel ik over van ene UserControl naar de andere, omdat pas NA de PageLoad de ButtonClick event (bijvoorbleed) wordt uitgevoerd, dus de resultaten van die 'klik' kunnen pas in de OnPreRender afgehandeld worden.

Daarin zet ik een Sessie-Var, waarmee ik de volgende Init/PageLoad de nieuwe UserControl laadt.

(Bij het laden van de UserControl in de Init werken een aantal zaken trouwens ook niet, die wel werken als de UserControl in de PageLoad wordt geladen... Ook vreemd..)

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Altijd handig
Now we set the text-box equal to the sUsername value. The event that this fires on is the OnPreRender event. This event is part of the page life cycle (which user controls consequently share), and we are overriding it to fire our code at that time. The OnPreRender event is one of the last events that fires during the creation of a page, so we are assured that the contents of the text box will not be disturbed by typical mechanisms in the ASP.NET page life cycle. If we ran this code at the Page_Load event, the contents of our text box would not remain intact because the ViewState information would clear it out. For more information on the course of a page from creation to disposal, look at my article entitled The ASP.NET Page Life Cycle. By using this functionality, we can set the username text box if we need to, as described in the code comments above.

[ Voor 88% gewijzigd door whoami op 01-07-2004 10:24 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Het probleem is dat mijn ervaringen niet overeenkomen met de Page Life Cycle... Als de ViewState wordt teruggezet bestaat de UserControl, en de DataGrid daarin, al, met de goede ID's.

Waarom dus de ViewState niet wordt teruggezet is mij een raadsel.

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Vergelijk je ID van je controls eens (zoals gegenereerd door INamingcontainer) voor en na je postback. Dit doe je door de gegenereerde clientside source (en dan de ID's van de datagrid) te gaan vergelijken.

Het zou me niets verbazen als deze niet overeenkomen, waardoor de viewstate dus de state niet kan restoren.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op 01 juli 2004 @ 10:29:
Vergelijk je ID van je controls eens (zoals gegenereerd door INamingcontainer) voor en na je postback. Dit doe je door de gegenereerde clientside source (en dan de ID's van de datagrid) te gaan vergelijken.

Het zou me niets verbazen als deze niet overeenkomen, waardoor de viewstate dus de state niet kan restoren.
Heb ik gedaan.. De ID die in de broncode van de HTML staat is activetab_dag, in dejavascript PostBack functie wordt ie aangeroepen als activetab$dag (met daarachter nog een aantal $_ctl items)

activetab is de ID van de UserControl, dag de ID van de datagrid. Lijkt dus te kloppen

  • gorgi_19
  • Registratie: Mei 2002
  • Nu online

gorgi_19

Kruimeltjes zijn weer op :9

Ik denk dat je meer moet letten op die _ctl items en de nummers dan op dat laatste id :) activetab_dag dat zal bij beiden wel kloppen; alleen de rest van de ID kan het verschil in zitten.

Dus bijvoorbeeld:
voor:
HTML:
1
_ctl1_Loadpane1__ctl0__ctl0_Period

na:
HTML:
1
_ctl1_Loadpane1__ctl1__ctl0_Period

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
De ID's van de _ctl die erna volgen lijken ook te kloppen. De editknop van de eerste = activetab$dag$_ctl3$_ctl1, de updateknop, na edit, is: activetab$dag$_ctl3$_ctl2

dus het gaat steeds om dezelfde control, met dezelfde row. Als ik een rij naar beneden opschuif dan verandert _ctl3 in _ctl4. Dus ook dat lijkt te kloppen
Pagina: 1