mere præcist end 17/10-2007 14:43:05 : Ved dynamiske kontroller skal disse tilføjes ved hvert load. ViewState husker ikke deres eksistens, og derfor skal de genskabes. Deres data tilgengæld bliver husket i viewstate, så derfor behøver man ikke hælde data i ved hver postback.
Jeg tilføje helt korrekt celler og rækker dynamisk.
Men så kommer jeg jo så til den næste ting. For nu kan jeg godt gå alle rækkerne igennem. Men værdien som jeg gerne vil gemme er en true/false værdi fra en checkbox, som jeg dynamisk har tilføjet til en celle.
Hvad gør man så der? Jeg er opretter nu samtlige rækker og celler ved postback. Og metoden jeg har til det, modtager nu en boolean værdi, som fortæller om den også skal fylde data i cellerne.
Den sætter jeg så til false ved postback.
men den checkbox jeg opretter dynamisk. Det er jo dens værdi jeg gerne vil gemme.
Mine metoder til oprettelse af rækker og celler ser således ud :
Her tilføjer jeg jo cb til cellen uanset om det er et postback eller ej. Men hvis jeg ikke gør det, så findes checkboksen ikke når jeg forsøger at gemme til SQL databasen.
Kan ikke lige genenmskue din kode men fundamentalt to ting:
1. Ved dynamiske kontroller skal de tilføjes igen ved hver postback. Dette gælder også din checkbox. Hvis den har en eller anden initialiseringsværdi skal du sætte den ved den første gang npr kontrollen tilføjes. Hvis det er denne brugeren ændrer i, så skal du ikke selv give den værdier ved efterfølgende postbacks, men aflæse dens værdi når brugeren har klikket på noget.
2. Jeg kan se du bruger den gamle ASP metode med at linke siden til sig selv, og agere på hvad der ligger i urlen. Så fremt det ikke er af valg, men fordi du ikke ved bedre, så læs lige dette:
Denne er altså ikke nødvendig - det er dertil vi har viewstate + eventhandlers:)
Din btn_savetasklist knap bør trigge en eventhandler, og i denne eventhandler kan du så kalde det den nu engang kalder - vel formentligt din SaveTaskStatus(Convert.ToInt32(User)) ting. Du får eventhandleren frem ved at dobbektklikke på din knap i designeren.
Inden jeg forlader dig, så skulle jeg lige prøve i VB - det virkede heller ikke med en kopi af din kode. Men, dette her virker:
Partial Class TestCell Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load MakeCell() If Not Page.IsPostBack Then FillCell() End If End Sub
Protected Sub MakeCell() Dim r As New TableRow Dim c As New TableCell r.Cells.Add(c) Table1.Rows.Add(r) End Sub
Protected Sub FillCell() Table1.Rows(0).Cells(0).Text = "TEST" End Sub End Class
Som du kan se så skaber jeg altid kontrollerne, og ylder dem op kun hvis det ikke er postback.
Kan ikke helt gennemskue den detaljerede forskel mellem de to, men dette her funker altså hos mig.
Har rettet min kode til nu. Det virker super godt nu. Eneste ting, som jeg stadig ikke kan få den til at huske, er når jeg markerer den checkbox som jeg opretter i en af cellerne.
Hvis checkboksen allerede bliver markeret når jeg løber gennem koden første gang. Dvs. hvis checkboksens .Checked property bliver sat ud fra værdi i min SQL database, så husker den at checkboksen skal være markeret ved postback.
Men hvis checkboksen først bliver checked ved at jeg selv gør det, så husker den ikke .checked property.
Men som sagt, alle de checkbokse som er markeret fra SQL gennemløbet i første omgang. De bliver fint ved med at være markeret.
Og EnableViewstate er sat til true ved checkboksene.
Det er sidste lille krølle på halen, ellers super god hjælp! Takker mange gange for det.
Når jeg sætter .Checked property for checkboksene ved første load. Altså med værdierne fra min SQL DB, så sætter jeg også checkboksenes Enabled værdi til false sådan her :
if (Convert.ToBoolean(SQDR["executed"])) { cb.Checked = true; cb.Enabled = false; }
Kun hvis Enabled er = med : False bibeholder den værdien ved postback. Hvis Enabled er = med : true, så forsvinder markeringen også ved disse.
Nu kan jeg få den til at gemme checked property for en checkbox ved postback. Så det er jo i princippet fint nok.
Men alligevel, så når jeg løber gennem mit table ved postback for at updatere min SQL tabel med checked property for hver række, så er checked = false, selvom den stor med et flueben i når siden vises igen. Det forstår jeg ikke.
Og igen, så de checkbokse som fik sat checked property til true ved generering af tabellen første gang, dem kan den sagtens sætte den korrekte værdi for.
Jeg har læst dit link, og i mit parallelle univers, hvor jeg er enehersker, ville den slags sprogforbrydere blive skudt for ikke at udtrykke sig klart. Hans konklusion er entydig nok, men forklaringen er en gang &¤#&#%¤"! :-)
Anyways, jeg selv har nogle applikationer med dynamisk tilføjede rækker/celler og checkboxes som funker fint, så gad vide om det er noget som har gemt sig i koden - kan du vise denne ?
Naturligvis kunne jeg ikke få koden til at køre men pyt:-)
Jeg har naturligvis problemer med at følge logikken, men for mig ser det ud til at ved postback, så bliver SaveTaskStatus kaldt fra Page_Load. Den kalder så SetupTaskView(UserId, false).
Hvis brugeren har klikket på Btn_save, så eksekveres ovenstående Page-Load ting, og derpå kaldes Save_User, som så igen kalder SetupTaskView, men denne gang med SetupTaskView(UserId, true);
SetUpTaskView(userID,False) opretter kontroller uden at tilskrive dem værdier, mens SetUpTaskView(userid,True) opretter kontroller og tilskriver dem værdier fra DB'en
Dvs det som evt måtte have ligget i ViewState bliver overskrevet fra DB'en ved kald nr 2 (forudsat jeg har opfattet kodelogikken korrekt :-)
Gad vide om det ikke er kernen i problemet ?
Jeg kan ikke helt overskue fra koden om antallet af rækker nogensinde ændres efter postback. Hvis dette er tilfældet, så ville jeg meget kraftigt anbefale, at dine celler og din checkbox får tilskrevet et ID således at, f.eks., C.ID="cxx" og CB.ID="cbYY" hvor hvert XX og YY skal være unik.
Ovenstående af hensyn til ViewState - hvis du ikke give kontrollerne specifikke id'er, så bruger frameworket de autogenererede id'er (fra en ende af) til at få fat i ViewState for de respektive kontroller. Hvis antallet af kontroller har ændret sig, elelr nogle rækker er fjernet mens andre bliver tilføjet, så risikerer du at enten får kontrollerne en viewstate som tilhørte andre kontroller af samme type (fra før postback), eller at det hele fejler (med en fejlmeddelelse), hvis en "forkert" kontroltype står for tur at få noget guf fra viewstate. Med specifikke id'er, så er frameworket ikke i tvivl om, hvad der skal matches med hvad.
Jeg må desværre ikke fremvise min tilsvarende kode. I princippet er koden ganske som den vist 17/10-2007 20:53:53, dvs jeg har fra PageLoad nogle kald til at opbygge hele sættet af kontroller som pladsholdere for data (labels/literals/links/checkboxes i tabelceller), og så nogle andre kald til at gennemløbe tabellen og fylde data i, som jeg bruger første gang i en eventhandler og ved efterfølgende postbacks fra page_load efter behov.
Ok, nu har jeg strikket et meget simpelt eksempel frem, på hvad mit problem er.
som du kan se herunder så har jeg 1 række med 1 celle som indeholder 1 checkbox. Ved postback er den string værdi jeg forsøger at trække ud, altid = false. Også selvom min checkbox er checked, og stadig ser ud til at være det efter et postback.
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) {
if (!Page.IsPostBack) { AddToTable(true); } else { AddToTable(false); } }
void AddToTable (Boolean DoDataFill) { TableCell C = new TableCell(); TableRow R = new TableRow(); R.Cells.Add(C); Table1.Rows.Add(R);
CheckBox cb = new CheckBox(); Table1.Rows[0].Cells[1].Controls.Add(cb);
if (!DoDataFill) { CheckBox checkbox = Table1.Rows[0].Cells[1].Controls[0] as CheckBox; String StringsomaltiderFALSE = checkbox.Checked.ToString(); } } }
Håber det er lettere at gennemskue. Det er nøjagtig samme problem i min rigtige kode. Her er jo så bare en masse andet kode, som forvirrer overblikket.
fedt nok - jeg har prøvet lidt forskelligt, og er nåetfrem til at følgende virker også (foruden at gøre det i handleren som du også har fået til at virke) : public partial class testcb : System.Web.UI.Page { protected void Page_Init(object sender, EventArgs e) {
Det virker ligeledes hvis man lader "genskabelsen" ske i Page_Load, men så først aflæser værdien i Page_LoadComplete eventet. Frameworket skal åbenbart have en "tænkepause", fra kontrollen er genskabt, til at den får sin viewstate tilbage:)
Ja det er ikke sådan helt logisk efter min mening. Men bare man kender fremgangsmåden så er det jo fint! Har overført ændringerne til min rigtige kode, og det spiller bare nu!
MANGE tak for hjælpen!
/Lasse
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.