19. august 2004 - 14:34Der er
18 kommentarer og 1 løsning
tabel der forsvinder ved postback
Jeg har et problem med en tabel som genereres dynamisk, som forsvinder når jeg trykker på min gem knap for at gemme mine ændringer. enableviewstate er sat til "true" så det ka ik være det. Når siden startes op oprettes tabellen vha. et kald til en function, fra Page_Load. detta kald forekommer dog ikke i Page_Load ved postbacks. Tabellens inhold ændres afhængigt af hvad man vælger på en træmenu(TreeView) som også er på siden. Når man så har fået tabellen til at se ud som man vil, så indfører man noget tekst i nogle tekstbokse i tabellen og trykker på en "gem" knap. problemet er bare at når jeg så har trykker på "gem" og tager fat i tabellen, så er den fuldstændig tom, ingen Rows at køre igenmnem overhovedet!????.
Nope der er ingen paneler. siden indeholder Et treeView, en knap og to to tabeller. Det hele er arrangeret i en alm html-tabel for at holde styr på deres placering. Det er hvad der er.
Hvis du ikke indsætter tabellen ved postback - vil den heller ikke eksistere. Hvis du smider kontroller ind på siden dynamisk bliver du nødt til at gøre det hver gang. Du kan stadig godt nøjes med at udføre eventuel databinding ell. efter det mønster du har beskrevet, men kontrollen skal altid ind. mvh
Du kan eventuelt smide din kode herud... Det er sikkert ikke mange ændringer der skal til for at du ser data hver gang, men kun databinder når det er nødvendigt. mvh
er ik helt klar over hvad du mener ved "indsætter"!!?...hvis du mener at jeg ska generere den igen ved postback vil det så ik overskrive de ændringer jeg har lavet?
Der forekommer ik rigtig databinding i den forstand at jeg bare angiver en source og beder den om at databind....jeg henter noget data ud fra en MS-sql database hvorefter jeg recursivt arrangerer dataene i tabellen afhængig af inholdet af nogle af felterne i tabellen sammen holdt med det man har trykker på i træmenuen. Hvis jeg bare ku angive en source og så skrive tabel.databind så havde jeg valgt at bruge et datagrid istedet, da det ville have været langt nemmere.
Det var fordi du skrev at du genererede den dynamisk, og at du oprettede den i page_load, at jeg gik ud fra at du "indsatte" den programmatisk. Med indsætte mener jeg at du tilføjer kontrollen til kontroltræet.
jeg bliver nødt til at se lidt af din kode, hvis jeg skal svare på de spørgsmål du stiller. gerne din page_load, og den metode der indsætter/generere/opretter/maler/skruer din tabel sammen :o)
databindingsmekanismen i .net er en lidt mere generel mekanisme end jeg forstår det du skriver, og du kan altid bruge det - også med det behov du beskriver.
Men... smid lidt kode - så skal vi nok få det fikset ;o)
private void Page_load(......) { if(!(IsPostBack)) { lav en topNode til Treeview; bygTreeView(topNode);
lavFørsteTabel(-1); //skal have "-1" som variabel da denne metode recursivt bygger et spejlbillede af //træet i tabellen baseret på det metoden opfatter som værende topnodens "ID"
lavAndenTabel(-1); //skal have "-1" som variabel da denne metode recursivt bygger et spejlbillede af //træet i tabellen baseret på det metoden opfatter som værende topnodens "ID"
} }
når man så trykker på en "node" i TreeView-menuen så kaster den jo en event som så laver om på begge tabelle afhængigt af hvilket niveau i træet man har trykket på. denne event ser ud som følger.(stadig seudo-kode)
if(anyNode.Expanded==false) { anyNode.Expand(); lavFørsteTabel(anyNode.Value); lavAndenTabel(anyNode.Value)); //anyNode.Value er den id som de to tabelskabende metoder opfatter som værende //topnode. } else { anyNode.Collapse(); lavFørsteTabel(anyNode.Value); lavAndenTabel(anyNode.Value)); } }
På den måde er tabeller en afspejling af det niveu i træet man har trykket på, og alt hvad der ligger under det niveau.
så har jeg selvfølgelig også en metode til at behandle button.click eventen på gemme knappen og en gem metode som denne kalder...de ser ud som følger.
int i=0; string tekst; while(i<andenTabel.Rows.Count;) { tekst=((TextBox)(andenTabel.Rows[index].cells[index].comtrols[index])).Text i++; } }
Mit problem er at i metoden gemAndenTabel() er andenTabel.Rows.Count altid 0, hvilket undrer mig. Jeg har jo lige siddet og fyldt tekst inde i flere tekstbokse, i flere rækker, i tabellen "andenTabel", så den burde jo ik være 0!!!?
hej frostedflake - undskyld ventetiden (har været væk fra orglet siden igår middag).
tak for koden.... det må jo siges at være meget som du har beskrevet, men det giver mig desværre ikke bedre muligheder for at finde ud af hvad der kan være problemet :o( (ked af at du brugte tid på det.... jeg har nok ikke formuleret mig klart nok)
det jeg prøvede at skrive var, at det er den kode du bruger til at lave tabellerne der synes at være interessant, og hvis du har noget aspx-kode som er relevant i forhold til dem - er det ligeledes væsentligt.
om du har angivet dem deklarativt i aspx-koden, eller indsætter dem programmatisk er væsentligt for mig at vide.
såhh.... hvis du har mulighed for at poste tilstrækkeligt til at jeg kan se hvordan du indsætter/generere/opretter/maler/skruer dine tabeller sammen tror jeg der er større sansynlighed for at jeg kan hjælpe.
Jeg har ik lige adgang til min kode fra den comp. jeg sidder ved nu, men jeg ka fortælle at jeg indsætter/generere/opretter/maler/skruer mine tabeller sammen programmatisk :-). Altså alle celler og rows bliver genereret i nogle løkker og recursive kald, men tabellerne som jeg sætter dem ind i har jeg bare hentet ind fra toolbaren i VisualStudio.net og placeret i en alm html tabel.
pointen i det er, at hvis du ikke få eksekveret den kode der genererer tabellen INDEN din gem-handler eksekveres, vil du aldrig kunne finde dine rækker mv. igen, da de ikke er blevet sat ind i kontroltræet.
som jeg forstår det du har lavet kræves det faktisk at din "node-click handler", eksekveres for at du har dine rækker.
det kan du desværre ikke gøre noget ved - det er simpelthen bare sådan det virker, og du bliver nødt til at sikre at de nødvendige rækker indsættes hver gang... der er ikke noget der blever "gemt for dig" hvad det angår.
hvis rækkerne sættes ind, og du f.eks. har en stak tekstbokse i rækkerne, skal frameworket nok sørge for at de værdier brugeren har indtastet bliver sat på de respektive objekter (f.eks. dine tekstbokse), men som din kode virker nu, er der simpelthen ikke noget at fylde det ind i.
jeg tror jeg forstår hvad du mener....jeg skal altså have fyret en nodeclick event, til den tilsvarende handler, af for at beholde min tabel med de nye indførelser!!?
Ja jeg prøver det lige....så får vi se om det virker.
øv det virker ik.....hmm nå...jeg har tænkt på at bruge et datagrid istedet...altså på den måde at jeg vil opbygge en alm ArrayList på samme måde som jeg har bygget den nuværende tabel op og så databinde datagriddet til ArrayListen....håber at Datagriddet har indbygget funktionalitet til at holde på dataene.
hej frosted :o) vis mig lige det du ikke kan få til at virke... Det vil ikke hjælpe dig at bruge et datagrid istedet, hvis problemet er det jeg har beskrevet.
Hmm jeg ka kun sende seudo-kode herind...du ved foretningshemmeligheder og sådan....Det meste af den overordnede kode er illustreret med den seudo-kode jeg sendte sidst...hvis der er nogle dele af den du gerne vil have have uddybed, med mere seudo-kode, så sig til.....jeg ska jo gerne have det her løst. :-)
aloha frostedflake... jeg kan se at jeg har syltet dig her. det må du undskylde :o( (har været uopmærksom).
jeg forsøger at se om jeg kan få ryttet lidt op, så du får et svar på denne her, hvis du kunne bruge det til noget, men du skal bare spørge hvis der er noget.
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.