Avatar billede pswin Nybegynder
16. april 2005 - 20:38 Der er 9 kommentarer og
1 løsning

Datagrid Viewstate og Postback

Jeg har en side med et datagrid der bliver bundet til en bagvedliggende ArrayList. Der er ingen problemer i selve bindingen. En af kolonnerne sætter jeg en tekstboks som jeg gerne vil have at brugerne kan opdatere værdierne i.
Der er en knap udenfor datagrid'et som når den klikkes på kalder en metode der skal gennemløbe datagrid'ets Items med en

foreach(DataGridItem item in Datagrid.Items)

Problemet er at datagrid'et ikke indeholder nogen Items til trods for at der fra siden der blev postet var 6 rækker i datagrid'et - det virker altså som om Viewstate ikke bliver opretholdt (det er enabled) er der nogen der har prøvet det samme og/eller har en forklaring på problemet....
Avatar billede burningice Nybegynder
16. april 2005 - 20:46 #1
1) har du sikret dit at viewstate rent faktisk er slået til?

2) hvordan er rækkefølgen for din databinding? Husker du at lade være med at sætte datasource ved postback?

3) prøv at kom med noget mere kode.
Avatar billede pswin Nybegynder
17. april 2005 - 00:35 #2
Hej :)

Ja det blev skrevet lidt hurtigt da jeg var på vej ud af døren. Men kodestumpen følger i denne besked.

1) Viewstate er slået til - tjek! :)

2) Databinding sker ved !IsPostBack, derefter sker den først efter manpulation af datagrid skulle finde sted.

3) Hvis det er en PostBack foretages intet i Page_Load og opdateringknappens eventhandler kaldes hvorfra understående metode kaldes:

private void Update()
{
  int count = 0;
  int amount = 0;

foreach(DataGridItem item in Datagrid.Items)
{
  ArrayListItem ai = new ArrayListItem ();  //ArrayListItem den klasse der repræsentere de objekter der lagres i en Arraylist - den arraylist der bindes til i første omgang...

    TextBox tempTextBox = (TextBox) item.Cells[0].Controls[0];
    amount = Convert.ToInt32(tempTextBox.Text);

    if(amount != ai.Amount)
    {
    //Gør noget ved ai
    }
}
//Datagrid.DataSource = ArrayList;
Datagrid.DataBind();
}

Problemet er at der tilsyneladende ingen Items er i Datagridet (selvom de bliver vist første gang siden loades. Det medfører at foreach løkken springes let og elegant over.

Alle steder jeg har set på nettet burde ovenstående kunne lade sig gøre hvorfor jeg synes det virker super mystisk (naturligvis) så hvis du/I har et godt bud er det super ellers må jeg jo æde det i mig og lave en EditCommandColumn...

PÅ forhånd tak for enhver hjælpen
Avatar billede burningice Nybegynder
17. april 2005 - 00:45 #3
nu er det ikke alverdens kode der er inde i din foreach-blok, og selvom det nok er et tåbeligt forslag, har du så prøver at lave en Response.Write(DataGrid.Items.Count.ToString()); lige før din foreach?
Avatar billede pswin Nybegynder
17. april 2005 - 02:37 #4
Nu har jeg og den skriver ikke overraskende 0 ud præcis som jeg kan se med debuggeren. Problemet er ret og slet at Viewstate ikke bliver fastholdt...og jeg kan bare ikke forstå hvorfor...

Skal jeg i Init generklære Sourcen, uden at databinde det giver jo ikke meget mening eller... (og hvis jeg databinder går de ændringer en bruger kan have foretaget i datagridet jo tabt).
Avatar billede burningice Nybegynder
17. april 2005 - 09:23 #5
jeg har lige lavet en hurtig tester, og det her virker fint (http://burningice.dk/eksperten.dk/610325/Default.aspx)

Og som du kan se, så binder jeg kun griddet en enkelt gang, og alligevel kan jeg tælle 6 items når jeg trykker på knappen.

////

<script runat="server">

    void Page_Load(object sender, EventArgs e) {

        if (!IsPostBack) BindGrid();

    }

    void BindGrid() {

        string[] str = new string[] { "hej", "med", "dig", "hvad",

"hedder", "du" };

        dg.DataSource = str;
        dg.DataBind();

    }

    void btn_Click(object sender, EventArgs e) {
        Response.Write(dg.Items.Count.ToString());
    }


</script>

    <html>
    <head> </head>
    <body>
    <form runat="server">


    <asp:DataGrid id="dg" runat="server" AutoGenerateColumns="true" />

    <br /><br />
   
    <asp:button id="btn" runat="server" Text="Click me"

onClick="btn_Click" />

    </form>
    </body>
    <html>
Avatar billede pswin Nybegynder
17. april 2005 - 11:46 #6
Hej Cyberfessor,

Ja jeg gjorde nogenlunde det samme ;) oprettede et nyt projekt og simulerede det samme og her opdagede jeg den store forskel. Årsagen til problemet er at siden afvikles i en ældre version af et CMS system, som i lige netop den version ikke fastholder Viewstate på fx datagridkontrollen (og muligvis heller ikke andre kontroller...). Derfor står jeg nu med to muligheder opgradere CMS'en eller finde en anden udvej en Datagrids - og det bliver vist ikke min beslutning.

Tak for al hjælpen og hvis du smider et svar får du pointen som tak for ulejligheden og så vi kan få lukket spørgsmålet.
Avatar billede burningice Nybegynder
17. april 2005 - 11:52 #7
kan du ikke bare enable viewstate så? :)
Avatar billede pswin Nybegynder
17. april 2005 - 12:20 #8
Problemet er
Avatar billede pswin Nybegynder
17. april 2005 - 12:22 #9
Problemet er at ViewState sådan set er enabled (og det bliver også fastholdt på andre kontroller fx tekstbokse har jeg lige testet)

Supporten på CMS'ets svar er da også at en opgradering er vejen frem - men jeg tror jeg kan lave en ok løsning ved brug af en ddl og en tekstboks ;)
Avatar billede burningice Nybegynder
17. april 2005 - 12:30 #10
ah, så det er ikke et komponent du/i selv har lavet?

men held og lykke med det i hvert fald.
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