Avatar billede beef12 Nybegynder
17. februar 2011 - 15:56 Der er 6 kommentarer og
1 løsning

ASP.NET - Problem med postback

Hej - jeg har et problem med postback i ASP.NET.

Jeg har lavet en tabel hvor hver celle indeholder en textbox, hvor jeg selv skræddersyer et unikt ID. Dette gør jeg i Page_Load.

<klip>
foreach (TimeItem item in itemSearch)
{
    inputBox.ID = uniqueID;   
}
</klip>

Derefter i mit Button Click event forsøger jeg at fiske alle værdier frem fra mine textboxes.

<klip>
Control ctrl = mainContent.FindControl("TimeTable");
Table timeTable = (Table)ctrl;
foreach (TableRow row in timeTable.Rows)
{
    foreach (TableCell cell in row.Cells)
    {
        foreach (Control ct in cell.Controls)
        {
            if (ct is TextBox)
            {
                TextBox box = (TextBox)ct;
                string value = box.Text;
            }
        }
    }
}
</klip>

Den finder mine controls og ID'er. Men box.Text er altid tom - selvom jeg udfylder den med en tekst.

Er der en venlig sjæl der kan forklare mig hvorfor box.Text ikke persisteres ved postback og hvad jeg skal gøre for at værdierne ikke forsvinder, således at jeg gemme dem i min DB?
Avatar billede keysersoze Guru
17. februar 2011 - 17:46 #1
jeg ved ikke hvad uniqueID - men det skal være samme ID også tværs af postbacks.
Avatar billede beef12 Nybegynder
17. februar 2011 - 20:07 #2
Jep - UniqueID er ens ved postback.
Avatar billede keysersoze Guru
17. februar 2011 - 22:16 #3
Umiddelbart ud fra hvad du fortæller lyder det rigtigt nok - men prøv evt at giv lidt mere kode.
Avatar billede beef12 Nybegynder
17. februar 2011 - 23:07 #4
//Først i PageLoad har jeg:

protected void Page_Load(object sender, EventArgs e)
{
    LoadTable(month, year);
}

//i LoadTable gør jeg følgende:

private void LoadTable(int month, int year)
    {
        // Table timeTable = new Table(); timeTable.CellSpacing = 0;
        int daysInMonth = System.DateTime.DaysInMonth(year, month);
        titleRow.Cells.Add(tc0);
        for (int i = 1; i <= daysInMonth; i++)
        {
            TableCell tc = new TableCell(); tc.Text = i.ToString();
            titleRow.Cells.Add(tc);
            tc.Width = Unit.Pixel(22);
            tc.BorderWidth = Unit.Pixel(1);
            tc.HorizontalAlign = HorizontalAlign.Center;
        }
        TableCell tcTotal = new TableCell(); tcTotal.Text = "Total";
        tcTotal.Width = Unit.Pixel(60);
        tcTotal.HorizontalAlign = HorizontalAlign.Center;
        tcTotal.BorderWidth = Unit.Pixel(1);
        titleRow.Cells.Add(tcTotal);
        TimeTable.Rows.Add(titleRow);

        //Øvrige rækker fra time typer
        List<TimeItemType> timeItemTypes = TimeItemType.GetTimeItemTypes();
        int rowNum = 0;
        foreach (TimeItemType timeItemType in timeItemTypes)
        {
            rowNum++;
            List<TimeItem> itemSearch = TimeItem.GetTimeItems();
            TableRow bodyRow = new TableRow();
            bodyRow.ID = "row" + rowNum;
            TableCell tc1 = new TableCell(); tc1.Text = timeItemType.TypeName;

            tc1.BorderWidth = Unit.Pixel(1);
            bodyRow.Cells.Add(tc1);
            decimal total = 0;
            for (int i = 1; i <= daysInMonth; i++)
            {
                DateTime cellDate = DateTime.Parse(year + "-" + month + "-" + i);
                TableCell tc = new TableCell(); tc.Text = "&nbsp;";
                tc.ID = "tctimeItemTypeID" + timeItemType.TimeItemTypeID + "$day" + i;
                TextBox inputBox = new TextBox();

                foreach (TimeItem item in itemSearch)
                {
                    inputBox.ID = "timeItemTypeID" + timeItemType.TimeItemTypeID + "$day" + i;
                    if (item.RegDate == cellDate)
                    {
                        inputBox.Text = DataType.ConvertDecimalToPrice(itemSearch[0].RegHours);
                        inputBox.ToolTip = itemSearch[0].Notes;
                        total += itemSearch[0].RegHours;
                    }
                }
                tc.Controls.Add(inputBox);
                bodyRow.Cells.Add(tc);
                tc.BorderWidth = Unit.Pixel(1);
                tc.HorizontalAlign = HorizontalAlign.Center;

            }
            TableCell tcTotal1 = new TableCell(); tcTotal1.Text = DataType.ConvertDecimalToPrice(total); //summen
            bodyRow.Cells.Add(tcTotal1);
            TimeTable.Rows.Add(bodyRow);
        }
        TimePanel.Controls.Add(TimeTable);
    }


//Og så når jeg klikker på SaveBtn fyrer jeg dette event af.

protected void SaveBtn_Click(object sender, EventArgs e)
{
    ContentPlaceHolder mainContent = (ContentPlaceHolder)this.Master.FindControl("MainContent");

    Control ctrl = mainContent.FindControl("TimeTable");
    Table timeTable = (Table)ctrl;
    foreach (TableRow row in timeTable.Rows)
    {
        foreach (TableCell cell in row.Cells)
        {
            foreach (Control ct in cell.Controls)
            {
                if (ct is TextBox)
                {
                    TextBox box = (TextBox)ct;
                    string value = box.Text;
                    string[] splitArr = box.ID.Split('$');
                    string timeItemID = splitArr[0].Replace("timeItemTypeID", "");
                    string day = splitArr[1].Replace("day", "");
                }
            }
        }
    }
}
Avatar billede keysersoze Guru
20. februar 2011 - 00:54 #5
Det eneste jeg næsten kunne gætte på var, at ikke alle elementer i din struktur få tildelt eget ID under oprettelsen så din textbox derfor bliver navngivet ud fra et andet hieraki. Hvis du debugger ned i din save ser ID'erne så korrekt ud i forhold til hvordan de er tildelt?
Avatar billede beef12 Nybegynder
20. februar 2011 - 16:15 #6
Ja - jeg er nået frem til sammen konklusion. Især fordi hvis jeg undlader at sætte ID, så virker det fint.

Smid et svar.
Avatar billede keysersoze Guru
20. februar 2011 - 18:09 #7
hvis du undlader at sætte id vil de, efter al sandsynlighed i hvert fald, blive tildelt samme dynamiske ID efter hver oprettelse og de vil derfor bevare deres state. At gøre det på den måde i dit setup giver også fin mening, men oftest vil man spørge på kontrollen med et kendt id fremfor en løkke som du kører og så vil det ikke kunne spille.

Men her et svar hvis jeg har været til hjælp.
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

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