06. januar 2007 - 19:11Der er
21 kommentarer og 1 løsning
Oprette dynamiske knapper med antal gived ved click-event
Jeg har fået noget til at virke med at oprette et antal knapper dynamisk. Dette skal ske senest i Page_Load for at den tilknyttede funktion skal virke.
Nu er det bare sådan at det endelige antal af knapper der skal laves fremkommer ved button_click på en anden knap på samme side. Den værdi er først "klar til læsning" ved Page_PreRender.
Er der nogen der har et bud på hvordan man kan løse dette ?
Her er koden der laver knapperne: For i As Integer = 0 To CInt(Label2.Text) b = New Button() b.ID = "Button " & i b.Text = "Knap nr. " & i AddHandler b.Click, AddressOf DynamicButton_Click Next i
Det er et tryk på en knap på den samme side der bestemmer antallet af knapper. Der er en tilføj-knap, hvor antallet af knapper bliver en større og en slet-knap (dynamisk oprettet) hvor antallet af knapper bliver en mindre. Det er eventhandlerne på knapperne der ændrer i objektets antalknapper-egenskab. Og den egenskab er ikke ændret ved Page_load.
Jeg har dog fået det til at fungere på følgende måde: Jeg opretter det sidst brugte antal knapper + 1 (dvs. det maksimale antal jeg skal bruge) i en skjult tabel på et tidligt stadie (page_init eller page_load). På et tidspunkt hvor antallet af knapper så er endelig kendt (fx. page_preprender) flyttes det korrekte antal knapper over på den endelige placering. Derefter slettes tabellen (hvilket nok er overflødigt da den jo alligevel er skjult). På den måde får jeg oprettet enten det præcise antal knapper jeg skal bruge eller også 2 for meget. Som så slettes. Dette virker da jeg ved hvormange knapper jeg maksimalt skal bruge og at det kun er et par for meget. Hvis man ikke kender antallet af knapper er det straks værre, medmindre man vil oprette rigtig mange knapper for at være sikker, men det bliver ikke pænt.
Jeg synes ikke min metode er særlig pæn, men det virker ;-)
OK, her lidt mere konkret. Det er en faktura med et antal fakturalinier. Man opretter en fakturalinie ved at udfylde nogle felter med antal tekst og beløb g tilføjer det til fakturaen ved at trykke på tilføj-knappen. Alle fakturalinier vises også på siden og der skal være en slet-knap ud for hver linie. Objektet faktura har så en egenskab der hedder antallinier. Når man tilføjer en linie bliver den tilføjet til objektet i event-handleren til tilføj-knappen. Dette sker efter selve fakturaen bliver vist på skærmen og derfor kommer den sidst tilkomne fakturalinie ikke med på skærmen. Omvendt når man trykker på en slet bliver linien slettet i objektet, men på skærmen bliver det sidste antal linier vist, da skærmen "skrives" inden event-handleren til slet af linie udføres. Hvis man så vælger at "skrive" skærmen senere for at få det rigtige antal liner (og knapper) med, så virker knapperne ikke.
Håber du kan gennemskue hvad jeg mener ;-)
Mht. Session er det samme problem; antallet i Session-variablen bliver ændret for sent i forhold til hvornår jeg skal bruge oplysningen
Jeg kunne ikke få den til at vise objekterne, uden at det skulle være koblet til databasen (som er en MySQL). Bl.a. fakturalinier skal ikke lagres i databasen, før der blivr trykket på en gem-knap.
Med en List behøver du ikke at smide noget som helst i databasen og den fungerer perfekt som datasource og det bliver nemmere at overskue en den løsning du er igang med nu.
Jeg vil gøre et forsøg når jeg kommer får tid. Det ville unægtelig være nemmere. Er lidt hårdt spændt for, så det kan godt være jeg ikke svarer inden for de nærmeste dage, men jeg har ikke glemt det.
Så er jeg igang med projektet igen, og jeg har forsøgt at få det til at virke med datasource, men kan ikke helt få det til at virke efter hensigten.
Mine klasser ser således ud (meget forenklet)
Class Faktura Private _fakturalinie as List(of Fakturalinie)
Class Fakturalinie Private _tekst as string Private _antalEnheder as integer Private _prisPrEnhed as decimal
Siden hvor listen skal bruges får overført den pågældende faktura via en sessionvariable:
dim fakt as Faktura fakt = Session("faktura")
Så er spørgsmålet hvordan det skal implementeres...
Skal objektdatasource knyttes til Faktura eller Fakturalinie ? Jeg ville mene til faktura, og så lave en funktion der returnerer en List(of ) med alle fakturalinierne. Men hvordan så med indsæt, opdater og slet af linier ?
Jeg må indrømme at jeg er lidt på bar bund, så jeg vil helst have nogle gode eksempler. Vi kan sagtens finde ud af noget med nogle flere point... !
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.