Avatar billede Slettet bruger
07. december 2007 - 21:29 Der er 2 kommentarer og
1 løsning

Dynamisk form og PostBack problem

Hejsa.

Jeg sidder med et problem, der vedrører en dynamisk genereret formular.

Jeg har en webform, hvor jeg som det første skal hente nogle kundedata fra en database ved at vælge kunden i en dropdown-liste og herefter klikke på en knap (første postback).

Herefter har jeg fx. et inputfelt, hvor det er muligt at specificere et tal. Når man trykker på genererForm vises x-antal input-felter med en tilhørende dropdown liste (andet postback), hvor man kan indtaste en vare og vælge en faktureringsperiode i antal år fra dropdownlisten.

Inputfelterne bliver genereret i en metode, der kaldes af en eventhandler-metode, således:

// ************************************************************************************
    // GenerateDomainTextBoxes_Click() - Eventhandler til domain-tekstbokse
    // ************************************************************************************
    protected void GenerateDomainTextBoxes_Click(object sender, EventArgs e)
    {
        string strNumberOfDomainTextBoxes = txtbox_NumberOfDomains.Text.Trim();
        if (!String.IsNullOrEmpty(strNumberOfDomainTextBoxes))
        {
            numberOfDomains = Convert.ToInt32(strNumberOfDomainTextBoxes);
            DisplayDomainControls(numberOfDomains);
        }
    }

// ************************************************************************************
    // DisplayDomainControls() - Opretter x-antal textboxes og ddls ud fra valgt antal
    // ************************************************************************************
    protected void DisplayDomainControls(int intNumberOfDomains)
    {
        for (int i = 1; i <= intNumberOfDomains; i++)
        {
            TextBox txtbox_Domain = new TextBox();
            txtbox_Domain.ID = "txtbox_Domain" + i.ToString();
            txtbox_Domain.CssClass = "textboxDomain";

            DropDownList dropdownList = new DropDownList();
            dropdownList.ID = "ddl_NumberYears" + i.ToString();
            ListItem item0 = new ListItem("Registreringsperiode", "0");
            ListItem item1 = new ListItem("1 år", "1");
            ListItem item2 = new ListItem("2 år", "2");
            ListItem item3 = new ListItem("3 år", "3");
            ListItem item4 = new ListItem("4 år", "4");
            ListItem item5 = new ListItem("5 år", "5");
            dropdownList.Items.Add(item0);
            dropdownList.Items.Add(item1);
            dropdownList.Items.Add(item2);
            dropdownList.Items.Add(item3);
            dropdownList.Items.Add(item4);
            dropdownList.Items.Add(item5);

            TableRow row = new TableRow();
            TableCell cellDomainLabel = new TableCell();
            TableCell cellDomainTextbox = new TableCell();
            TableCell cellDomainYears = new TableCell();

            cellDomainLabel.Text = "Domæne " + i.ToString();
            cellDomainTextbox.Controls.Add(txtbox_Domain);
            cellDomainYears.Controls.Add(dropdownList);

            row.Cells.Add(cellDomainLabel);
            row.Cells.Add(cellDomainTextbox);
            row.Cells.Add(cellDomainYears);
            tableDomains.Rows.Add(row);
        }
    }

Når jeg til sidst har indtastet x-antal varer og valgt tilhørende faktureringsperioder for disse varer, klikker jeg på en knap med en tilhørende eventhandler, der så gerne skulle kunne hente værdierne ud fra formfelterne og dropdownlisterne og samle det hele sammen i en ordre.

Jeg benytter her:

for (int i = 1; i <= numberOfDomains; i++)
                {
                    Response.Write(Request.Form["txtbox_Domain" + i.ToString()] + "<br />");
                }

Det virker dog ikke, da det virker som om felterne er tomme.
Det skal siges at jeg er nødt til at 'tvinge' mit valg af antal form-felter på siden i min pageLoad med:

        // Variable til generering af forms ved postback
        if (numberOfDomains > 0)
            DisplayDomainControls(numberOfDomains);
        if (numberOfServices > 0)
            DisplayServiceControls(numberOfServices);

Hvor numberOfDomains og numberOfServices er sat i de føromtalte eventhandler-metoder, der genererer x-antal form-felter.

Jeg har lavet en tilsvarende test på en anden webform - dog lidt mere simpel. hvor det virker fint med at indtaste et tal og derefter generere et antal tekstbokse, som man kan udfylde og sende tilbage. Her skrives indholdet fint ud på siden efter det andet PostBack.

Men har jeg overset noget her, eller er der en bedre måde at lave det jeg forsøger at lave?
Avatar billede ieconfig Nybegynder
08. december 2007 - 22:46 #1
Er det ikke fordi du aspnet give dine kontroller et prefix i ID'et (ctl001_ID) ?
Avatar billede Slettet bruger
09. december 2007 - 02:09 #2
Hej.

Nej det gør jeg ikke. Men sådan vises det i kildekoden. Det er noget som .net giver det. Jeg navngiver ligesom i min kode herover.

Med venlig hilsen.
Thomas
Avatar billede Slettet bruger
10. december 2007 - 20:51 #3
Jeg har fundet en løsning på problemet.
I stedet for Request.Form, henter jeg data på serversiden ved hjælp af FindControl(), da mine formfelter jo ligger i en autogenereret tabel.
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