Avatar billede c-sharp Nybegynder
19. april 2005 - 15:21 Der 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:

navn: tekstfelt
adresse: tekstfelt
billede: billedefelt
kommentar: tekstarea

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.
Avatar billede burningice Nybegynder
20. april 2005 - 00:36 #1
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
  }
}
Avatar billede c-sharp Nybegynder
20. april 2005 - 08:32 #2
Hej Cyberfessor

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?
Avatar billede burningice Nybegynder
20. april 2005 - 08:48 #3
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:

dinRepeater_ItemDataBound(...) {
  ((PlaceHolder)e.Item.FindControl("dinPlaceholder)).Controls.Add(e.Item.DataItem);
}


ang. at løbe dine items igennem kan du nu udnytte at de ligger i en repeater:

foreach (RepeaterItem ri in this.dinRepeater.Items) {
  foreach (Control c in ri.Controls) {
    (...)
  }
}
Avatar billede burningice Nybegynder
20. april 2005 - 08:49 #4
ItemDataBound skal nok se sådan her ud for at compileren ikke skal brokke sig

dinRepeater_ItemDataBound(...) {
  ((PlaceHolder)e.Item.FindControl("dinPlaceholder)).Controls.Add((Control)e.Item.DataItem);
}
Avatar billede c-sharp Nybegynder
20. april 2005 - 13:16 #5
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?
Avatar billede burningice Nybegynder
20. april 2005 - 18:17 #6
:) well... så må du lave dit eget object der kan wrappe omkring en control og en tekst:

public class MinKlasse {
  public Control Control;
  public string Text;

  public MinKlasse(Control control, string text) {
      this.Control = control;
      this.Text = text;
  }
}

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;
  }

  coll.Add(new MinKlasse(c, reader.GetString(0));
}

dinRepeater_ItemDataBound(...) {
  MinKlasse mk = (MinKlasse)e.Item.DataItem;

  ((PlaceHolder)e.Item.FindControl("dinPlaceholder)).Controls.Add((new LiteralControl(mk.Text));
  ((PlaceHolder)e.Item.FindControl("dinAndenPlaceholder)).Controls.Add((mk.Control);

}
Avatar billede c-sharp Nybegynder
21. april 2005 - 13:43 #7
Får jeg ikke et problem med de komponenter jeg tilføjer dynamisk, vil de ikke forsvinde når siden submittes?
Avatar billede burningice Nybegynder
21. april 2005 - 13:48 #8
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.

du kan evt. læse om LifeCycle af en asp.net-side her: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcontrolexecutionlifecycle.asp
Avatar billede c-sharp Nybegynder
21. april 2005 - 15:55 #9
Så er der problemer igen :-)

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 :-/
Avatar billede burningice Nybegynder
21. april 2005 - 17:27 #10
:) 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;
            }
        }
      }
  }
}
Avatar billede c-sharp Nybegynder
27. april 2005 - 06:24 #11
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.
Avatar billede burningice Nybegynder
27. april 2005 - 09:05 #12
well... kan du så ikke i din dropdown-event lave en dinRepeater.Controls.Clear() og så smide felterne ind igen ? :)
Avatar billede c-sharp Nybegynder
28. april 2005 - 11:10 #13
Jo det kan jeg vel, men det er vel ikke den mest elegante måde at løse problemet på? Nu loader jeg jo data i repeateren 2 gange :/

Nå man du skal ihvertifald have tusind tak for din hjælp!!
Avatar billede burningice Nybegynder
28. april 2005 - 11:18 #14
du kan sørge for tjekke for postback i din page_load, og kun loade hvis det ikke er postback
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester