[ akrosoft @ 16.08.2004. 19:43 ] @
Imam aspx stranicu na koju sam postavio placeholder, u koji dinamicki dodajem razlicite user kontrole (ascx) prema potrebi pomocu:
Code:

PlaceHolder1.Controls.Add(LoadControl("modules/modPR.ascx"));

Kada se stranica prvi put ucita, user kontrola se lepo prikaze, medjutim, u user controli imam npr list box koji izaziva postback, i kada se to desi, nakon toga, placeholder u aspx stranici vise ne prikazuje user kontrolu. Ok, pretpostavljam da moram da ponovo ucitam kontrolu u placeholder na page_load ....posto mi se cini da nema drugog resenja, ali je problem sto ta user kontrola koja je sadrzala neke vrednosti u listboxu koje je korisnik promenio, sto je izazvalo postback, nakon ponovne inicijalizacije i ubacivanja u controls collection placeholdera ne pamti vrednosti koje je korisnik promenio u list boxu pre post backa.
Sta mi je ciniti??? Da li da negde pamtim viewstete UserControle ili PlaceHoldera, gde i kako, ili nesto trece?

Thx
[ havramm @ 16.08.2004. 22:24 ] @
Pogledaj prikacenu arhivu. Da li ti to mozda resava stvar?

Stavio sam da se korisnicka kontrola izmedju dva PostBack-a cuva u objektu sesije.

Probaj pa javi.
[ spartak @ 17.08.2004. 08:02 ] @
Pretece me kolega :-)

Elem Dule, predlazem takodje snimanje viewstate u sesiju pa kad ponovo ucitas kontrole postavis njihovo stanje iz snimljenog viewstate.

Interna sala: Osim ukoliko nemas sedamhiljadaosamstotridesetpetu stored procedure koja ce sve to da radi :-)
[ esnaf @ 17.08.2004. 08:42 ] @
Citat:
akrosoft: Imam aspx stranicu na koju sam postavio placeholder, u koji dinamicki dodajem razlicite user kontrole (ascx) prema potrebi pomocu:
Code:

PlaceHolder1.Controls.Add(LoadControl("modules/modPR.ascx"));

Kada se stranica prvi put ucita, user kontrola se lepo prikaze, medjutim, u user controli imam npr list box koji izaziva postback, i kada se to desi, nakon toga, placeholder u aspx stranici vise ne prikazuje user kontrolu. Ok, pretpostavljam da moram da ponovo ucitam kontrolu u placeholder na page_load ....
Thx


Sto se tice prkazivanja kontrole na PostBack stvar je jednostavna:
VB.NET
Code:

If Page.IsPostBack
'code za postback
Else 
'code za prvo ucitavanje strane
End If


[ havramm @ 17.08.2004. 09:52 ] @
Citat:
spartak: Elem Dule, predlazem takodje snimanje viewstate u sesiju pa kad ponovo ucitas kontrole postavis njihovo stanje iz snimljenog viewstate.

Ja sam stavio da se "cela" kontrola čuva u session:
Code:
Control ctrl = LoadControl("NekaUserControla.ascx");
...
Session["UserControl"] = ctrl;

i zatim kada se ponovo učitava:
Code:
if (Session["UserControl"] != null)
{
    Control ctrl = Session["UserControl"] as Control;
    ...
    PlaceHolder1.Controls.Add(ctrl);
}


Baš bi me zanimalo ako uspevaš samo viewstate (tj. stanje kontrole) da sačuvaš, kako bi to odradio?

P.S. Nije ironično pitanje, stvarno me interesuje, pošto to još nisam probao.
[ spartak @ 17.08.2004. 10:20 ] @
Pogresno sam se izrazio, mislim na istu stvar kao i ti.

Koliko sam razumeo problem, on svaki put ucitava iznova kontrolu u placeholder (posle postback), sto je naravno svaki put nova instanca tog tipa, zar ne.

Osim ukoliko je ucita iz viewstate, kada ce dobiti "staru" instancu.
[ havramm @ 17.08.2004. 10:31 ] @
Citat:
spartak: Osim ukoliko je ucita iz viewstate, kada ce dobiti "staru" instancu.

Opet se osećam zbunjeno . viewstate = Session ?
[ spartak @ 17.08.2004. 10:58 ] @
:-) A je, radim pet stvari istovremeno.

Odzbuni se slobodno, lapsus je u pitanju.
[ mmix @ 17.08.2004. 11:00 ] @
Citat:
havramm: Opet se osećam zbunjeno . viewstate = Session ?


Naravno da nije isto ViewState ide u sam HTML stranice, Session se čuva na serveru...

Citat:
spartak: Koliko sam razumeo problem, on svaki put ucitava iznova kontrolu u placeholder (posle postback), sto je naravno svaki put nova instanca tog tipa, zar ne.


Tačno, ali to se UVEK dešava u SVIM aspx stranicama, na svaki zahtev se iznova kreiraju sve kontrole na stranici, ali se u slučaju da je EnabledViewState uključen njihovo interno stanje se vraća u stanje koje je bilo pri renderovanju htmla.

Citat:
havramm: Pogledaj prikacenu arhivu. Da li ti to mozda resava stvar?
Stavio sam da se korisnicka kontrola izmedju dva PostBack-a cuva u objektu sesije.


Nema potrebe za ovim, view state rešava ovaj problem koji njega muči...
Okačio sam ti jednu stranicu sa placehodlerom i dugmetom i jednu user kontrolu koja se puni na !PostBack i ovo radi savršeno preko viewstate-a

Citat:
akrosoft: Imam aspx stranicu na koju sam postavio placeholder, u koji dinamicki dodajem razlicite user kontrole (ascx) prema potrebi pomocu:
Code:

PlaceHolder1.Controls.Add(LoadControl("modules/modPR.ascx"));

Kada se stranica prvi put ucita, user kontrola se lepo prikaze, medjutim, u user controli imam npr list box koji izaziva postback, i kada se to desi, nakon toga, placeholder u aspx stranici vise ne prikazuje user kontrolu. Ok, pretpostavljam da moram da ponovo ucitam kontrolu u placeholder na page_load ....


Dobro pretpostavljaš, svaki put moraš da uradiš LoadControl bez obzira na postback. Tebi ne radi zato što jedna ili više od sledećih stavki nije ok:

1. PlaceHolder1.EnableViewState na glavnoj strani mora da je true
2. Pređi u HTML prikaz glavne strane, u liniji na vrhu koja počinje sa <% Page ... ne sme da stoji EnableViewState="false"
3. Ako gornja stavka uopšte ne postoji, pogledaj web.config fajl, ne sme da postoji linija <pages EnableViewState="false">
4. U kontroli, listbox-ov EnableViewState mora da bude true
5. Pređi u HTML prikaz kontrole, u liniji na vrhu koja počinje sa <% Control ... ne sme da stoji EnableViewState="false"

AKo su ti svih pet stavki ispunjene, ViewState mora da zapamti sadržaj listbox-a. Ako ti ni posle ovog ne radi, okači aspx i cs za glavnu stranu i kontrolu pa da vidimo šta je...
[ akrosoft @ 17.08.2004. 11:29 ] @
Citat:
havramm: Stavio sam da se korisnicka kontrola izmedju dva PostBack-a cuva u objektu sesije.

Ok, hvala, palo je meni to na pamet, ali je problem sto session varijable opterecuju serverske resurse. A i zasto to raditi kada se po automatizmu, ako je enableViewSession za user kontrolu setovan, cuva state data user kontrole u viewstate-u. Sto kaze Milos, moguce je da cuvam i session varijable u bazi, ali to sa druga strane utice na brzinu web aplikacije.

Citat:
spartak:
Elem Dule, predlazem takodje snimanje viewstate u sesiju

Da bih snimao viewstate user kontrole ona mora biti Serializable, sto mi ne odgovara.
Citat:
esnaf:
Sto se tice prkazivanja kontrole na PostBack stvar je jednostavna:

Nije bas tako jednostavna, IsPostBack user kontrole prakticno radi base.IsPostBack stranice u koju je ugnjezdena UserKontrola, tako da ce vracati true i ako je user kontrola prvi put ucitana a glavna (template) stranica postbackovana. Ok, to sam resio overridovanjem LoadViewState user kontrole:

Code:

private bool _FirstLoad = true;
private void Page_Load(object sender, System.EventArgs e)
{
    if (_FirstLoad)    
        PopulateData(); 
}
protected override void LoadViewState(object savedState)
{
    _FirstLoad = false;
    base.LoadViewState (savedState);
}


Citat:
spartak:
Koliko sam razumeo problem, on svaki put ucitava iznova kontrolu u placeholder (posle postback)

Bez obzira da li je postback, moram uvek da je ucitavam, nema druge koliko znam, probaj da stavis placeholder na stranicu, i uradi postback stranice i videces da ce se placeholder, controls kolekcija isprazniti.
Citat:
mmix:
AKo su ti svih pet stavki ispunjene, ViewState mora da zapamti sadržaj listbox-a. Ako ti ni posle ovog ne radi, okači aspx i cs za glavnu stranu i kontrolu pa da vidimo šta je...

Svi moguci enableViewState su mi ukljuceni, tesko mi je da izdvojim taj deo da zakacim kod, posto ima dosta stvari koje su zavisne od baze, pa cu pokusati posle da napravim malu simulaciju toga i da okacim.

Hvala svima.....

[ mmix @ 17.08.2004. 11:35 ] @
Citat:
akrosoft: Svi moguci enableViewState su mi ukljuceni, tesko mi je da izdvojim taj deo da zakacim kod, posto ima dosta stvari koje su zavisne od baze, pa cu pokusati posle da napravim malu simulaciju toga i da okacim.
Hvala svima.....

Probaj da u tu tvoju aplikaciju u root ubaciš stranicu i user kontrolu koju sam okačio i reci da li ti radi, da odmah eliminišemo pola problema...

Citat:
akrosoft: Nije bas tako jednostavna, IsPostBack user kontrole prakticno radi base.IsPostBack stranice u koju je ugnjezdena UserKontrola, tako da ce vracati true i ako je user kontrola prvi put ucitana a glavna (template) stranica postbackovana. Ok, to sam resio overridovanjem LoadViewState user kontrole:


Hmmm, nisi u pravu. kontrola poziva base.IsPostBack, ali base je ovde tebi System.Web.UI.UserControl, čiji IsPostBack poziva IsPostBack svog kontejnera a to je System.Web.UI.Page tj. tvoja glavna strana koji će ti vratiti pravu vrednost. Meni definitivno tako radi, sad si me bio zbunio pa sam single-stepovo kroz Page_Load kontrole... Dakle usercontrol.IsPostBack je uvek isto što i Page.IsPostBack strane u koju je kontrola učitana...

[ akrosoft @ 17.08.2004. 11:52 ] @
Citat:
mmix: Hmmm, nisi u pravu. kontrola poziva base.IsPostBack, ali base je ovde tebi System.Web.UI.UserControl, čiji IsPostBack poziva IsPostBack svog kontejnera a to je System.Web.UI.Page tj. tvoja glavna strana koji će ti vratiti pravu vrednost. Meni definitivno tako radi, sad si me bio zbunio pa sam single-stepovo kroz Page_Load kontrole... Dakle usercontrol.IsPostBack je uvek isto što i Page.IsPostBack strane u koju je kontrola učitana...

Na to sam mislio, pogresio sam sa base, mislio sam na container.......Ali je sustina u tome sto ce IsPostBack user kontrole vratiti isto vrednost kao i page isPostBack. Tu je zez, ako imas template page sa place holderom ciji se sadrzaj menja, ucitavaju se razne user kontrole, npr, bila je ucitana UC1 i na button click strane ucitavam UC2, postback u UC2 ce mi uvek vratiti true i ako se UC2 prvi put ucitava. Jel tako?
[ mmix @ 17.08.2004. 11:54 ] @
Ah, čekaj, čekaj, nismo se mi dobro razumeli, tvoja glavna strana prvi put učitava user kontrolu posle postbacka na osnovu nekog odabira korisnika?
Moram da te razočaram da user kontrole nisu dizajnirane za taj način rada. Suviše je uvezana za template stranicu da bi ti radilo ovako. One su jednostavno dizajnirane da SVAKI put budu učitane u glavnu stranicu...

Napravi metod u user kontroli koji će da puni podacima child kontrole i kad prvi put uradiš LoadControl iz glavne, pozovi taj metod jedanput, posle će viewstate preuzeti... Page_Load kontrole ostavi "prazan".
[ akrosoft @ 17.08.2004. 12:32 ] @
Ok, resio sam stvar, valjda.....:)
Fora je u tome sto da bi se restorovao view state kontrle u place holder trebaju da budu ucitane u page_load stranice. Koncepcija je bila da imam template stranicu sa menijem i placehlderom, i u zavisnosti od selektovanog menu itema ucitavam neku user kontrolu u dogadjaju clikck menu itema. E, kada sam prebacio ucitavanje user kontrole iz dogadjaja click menu itema, u dogadjaj Page_load template stranice (be obzira na post back, uvek moram ponovo da ucitam), sve radi ok, odnosno viewState user kontrole se automatski restoruje i ako ponovo radim Load kontrole. To me je u principu i zbunjivalo, jer sam mislio da na ponovni load viewState nece moci da se restoruje, ali mali je pametniji nego sto sam mislio :). Naravno, u Page_load pratim koji je meni selektovan i prema tome ucitavam odredjenu user kontrolu.

Btw, nije direktno vezano za prvobitan problem, ali:
Citat:
mmix: Napravi metod u user kontroli koji će da puni podacima child kontrole i kad prvi put uradiš LoadControl iz glavne, pozovi taj metod jedanput, posle će viewstate preuzeti... Page_Load kontrole ostavi "prazan".

...mislis da je to bolja varijanta nego da overridujem LoadViewState user kontrole, i da u njega upisujem _FirstLoad vrednost i na osnovu toga u load user kontrole filujem podatke?
[ mmix @ 17.08.2004. 13:53 ] @
Citat:
akrosoft
...mislis da je to bolja varijanta nego da overridujem LoadViewState user kontrole, i da u njega upisujem _FirstLoad vrednost i na osnovu toga u load user kontrole filujem podatke?


AKo se ne varam (probaj sa break pointima), ali _FirstLoad ti je private bool i biće postavljen na true pri svakom učitavanju user kontrole, pa će, ako se ne varam, PopulateData() biti pozvan svaki put bez obzira na postback...


Izmena: Varam se :), radi ok. LoadViewState event se ne podiže na prvi load. To opet znači da prokletinja zna kad je prvi put učitana, mogli su baš i da publikuju tu vrednost za user kontrole, baš zbog ovakve situacije...

[Ovu poruku je menjao mmix dana 17.08.2004. u 16:30 GMT]
[ akrosoft @ 17.08.2004. 14:27 ] @
Da, prilikom inicijalizacije kontrole _FirstLoad ce biti postavljen na true, ali nakon toga, a pre Page_Load ce uci u LoadViewState i postaviti ga na false prilikom postbacka kontrole. Koliko vidim, postavljajuci break point, u LoadViewState ulazi samo prilikom post backa kontrole, tako da prilikom inicijalnog loadovanja kontrole _FirstLoad na inicijalnoj vrednosti (true), a u ostalim slucajevima ce mu se promeniti inicijalna vrednost na false pre Page_load-a.