19. april 2005 - 15:21Der er
13 kommentarer og 1 løsning
Hjælp til dynamisk formular
Jeg skal have lavet en dynamisk formuar. Den skal fungere på følgende måde:
I databasen ligger forskellige felter eks. navn, adresse, billede, kommentar. Til hvert af disse felter høre der feltdefinitation (det er en variable som jeg sætter) eks:
det skal så være mugligt at vælge hvilke felter man vil have med på sin formular.
Er der nogen der har nogle idé til hvordan man laver en sådan løsning, her tænker jeg mest på hvordan styrre jeg de forskellige felter på formularen, og henter de indtastede værdier.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
det nemmeste vil være at lavet et switch-case system ala det her:
IDataReader reader = // get the reader
while (reader.Read()) { string type = reader.GetString(1);
switch(type) { case "tekstfelt": TextBox txt = new TextBox(); this.Controls.Add(txt); break; case "billedfelt": ImageButton img = new ImageButton(); this.Controls.Add(img); break; case "textarea" TextBox txt = new TextBox(); txt.Multiline = true; txt.Height = 100; this.Controls.Add(txt); break; } }
Når du så skal hente dine værdier ud kan du lave et lign. system:
foreach (Control c in this.Controls) { if (c is TextBox) { TextBox txt = (TextBox)c; string s = txt.Text; // Gør noget med s } else if (c is ImageButton) { ImageButton img = (ImageButton)img; // Gør noget med img } }
Det er rart at se at du er her så meget for tiden :-), specielt nu hvor snepnet ikke er her så tit :-(.
Når man nu opretter som du har vist komponenterne til siden, vil de så ikke bare blive smidt på side rimlig tilfældigt? Kunne man evt. liste dem i en repetare for bedre at kunne styrre layoutet?
Når du så løber dem igennem for at hente værdierne, løber du så alle konmponenter igennem på hele siden? hvis det er tilfældet kan man så ikke afgrænse området, for jeg har også nogle faste indtastningsfelter?
de er rigtigt at min psuodo-kode smider dem ind rimelig tilfældigt. Jo, du kan godt lave en repeater til det. Så skal din kode der opretter alle controllerne bare tilføje dem til en ArrayList og så binde det til din repeater.
Eks.
IDataReader reader = // get the reader ArrayList coll = new ArrayList();
while (reader.Read()) { string type = reader.GetString(1);
switch(type) { case "tekstfelt": TextBox txt = new TextBox(); coll.Add(txt); break; case "billedfelt": ImageButton img = new ImageButton(); coll.Add(img); break; case "textarea" TextBox txt = new TextBox(); txt.Multiline = true; txt.Height = 100; coll.Add(txt); break; } }
dinRepeater.DataSource = coll;
i din repeater skal du så have en placeholder der hvor kontrollen skal placeres, og i din ItemDataBound-eventen placerer du så kontrollen på denne måde:
Det begynder at ligne en løsning jeg kan brug, men hvad så med den tekst der skal stå foran tekstboksen, eks. navn, adresse..... hvordan får jeg fat i den fra min repeater?
while (reader.Read()) { string type = reader.GetString(1); Control c = null;
switch(type) { case "tekstfelt": TextBox txt = new TextBox(); c = txt; break; case "billedfelt": ImageButton img = new ImageButton(); c = img; break; case "textarea" TextBox txt = new TextBox(); txt.Multiline = true; txt.Height = 100; c = txt; break; }
jo.. dine kontroller skal tilføjes til siden hver gang. Det kan evt. gøres i Init-eventen på din side, på den måde eksisterer de når indholdet af viewstaten skal populeres, og dine kontroller får derfor den værdi som brugeren tastede ind i dem på klienten.
Når jeg skal gemme de indtastede data har jeg problemer med at finde dem i repeateren. Skal jeg først finde placeholderen og derefter finde tekstboksen i placeholderen eller hvordan fungere det? Jeg synes jeg har prøvet alt :-/
:) ja... det bliver du faktisk nødt til. Det havde jeg ikke lige tænkt på, men de enkelte kontroller er jo faktisk childs til Placeholderen:
// Hent værdier
foreach (RepeaterItem item in dinRepeater.Items) { foreach (Control c in item.Controls) { if (c is PlaceHolder) { if (((PlaceHolder)c).Id = "dinAndenPlaceholder") { Control cc = c.Controls[0]; // Vi går ud fra der kun er en kontrol i hver placeholder if (cc is TextBox) { string s = ((TextBox)cc).Text; // Gør noget med s; } } } } }
cyberfessor du skal endnu engang have tusind tak for din hjælp!! smid et svar så er der point på vej til dig...
Jeg har dog et lille tillægsspørgsmål, så jeg har smidt 30 point oven i hvis du også kan hjælpe med det.
De felter der er på formularen skal ændre sige efter hvad man vælger i en dropdownbox, der er implementeret fast på formularen. Mit problem er nu at jeg i InitializeComponent() loader alle de dynamiskefelter, så når jeg når til funktionen der bliver kaldt på baggrund af den event fra dropdownboxen, er alle felter allerede sat på siden.
du kan sørge for tjekke for postback i din page_load, og kun loade hvis det ikke er postback
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.