Avatar billede jensen2005 Nybegynder
31. marts 2008 - 17:12 Der er 10 kommentarer og
1 løsning

Viewstate - Hvorfor virker det her?

Hej eksperter

Jeg har en datatabel som jeg gemmer i viewstate og igen henter ind i et gridview.

Hvis jeg laver ændringer til datatabellen UDEN AT GEMME I VIEWSTATE BEGEFTER IGEN – så bliver ændringerne gemt!

Jeg troede egentlig at man skulle gemme i/overskrive viewstate hver gang man lavede en ændring i en datatabel.
Avatar billede jokkejensen Novice
31. marts 2008 - 17:28 #1
Nej det er .net's egen variable, og indeholder en del flere oplsyninger..
Avatar billede jensen2005 Nybegynder
31. marts 2008 - 17:36 #2
Hej JokkeJensen

Det vil sige at asp.net holder styr på det for mig - og at jeg ikke behøver at tilføje følgende til --> ViewState["afd_DataTable"] = afdeling; <-- til funktionen "ny_række"?.

protected void lav_tabel(object sender, EventArgs e)
    {
        DataTable afdeling = new DataTable("Afdeling");
        DataColumn eid = new DataColumn("Eid");
        eid.AutoIncrement = true;
        eid.DataType = typeof(int);
        eid.AutoIncrementStep = 1;
        eid.Unique = true;
        eid.AllowDBNull = false;
        eid.Caption = "EID";
        afdeling.Columns.Add(eid);
        DataColumn kunde_navn = new DataColumn("Kunde_navn");
        kunde_navn.MaxLength = 50;
        kunde_navn.DataType = typeof(string);
        afdeling.Columns.Add(kunde_navn);
        ViewState["afd_DataTable"] = afdeling;
    }



protected void ny_række(object sender, EventArgs e)
    {
      DataTable afdeling = (DataTable)ViewState["afd_DataTable"];
        DataRow new_row_afd = afdeling.NewRow();
        new_row_afd["Kunde_navn"] = txt_ny_afd.Text;
        afdeling.Rows.Add(new_row_afd);
           
           
    }

protected void opdater_grid(object sender, EventArgs e)
    {
      grid_afd.DataSource = (DataTable)ViewState["afd_DataTable"];
      grid_afd.DataBind();
}
Avatar billede kalp Novice
31. marts 2008 - 19:52 #3
Nu arbejder ikke så meget med DataTables, men man kan så vidt jeg ved gäre så den arbejder live imod databasen.

Det kan da forklare hvorfor det öndre sig i din database uden du selv skal trykke på en opdateringsknap.

man kan sikkert sötte datatable til at bruge en optimistisk trategi og det vil så läse problemet.

Det jeg lige sagde gölder kun hvis jeg ikke tager fejl med hensyn til de DataTables:)

beklager de svenske tegn.. sidder lige sverige!!
Avatar billede jensen2005 Nybegynder
31. marts 2008 - 20:25 #4
Hej Kalp

Datatabelen ligger i memory og arbejder ikke med en database.
Avatar billede jensen2005 Nybegynder
31. marts 2008 - 21:22 #5
Koden virker fint nok.

Jeg prøver bare lige helt at forstå hvorfor.

Jeg tror at jeg opfatter viewstate forkert!

Kan ikke helt forstå hvorfor at når jeg laver en ny række i funktionen "ny_række()" UDEN at gemme i viewstate så husker .net ændringerne næste gang jeg binder til gridview!.....
Avatar billede kalp Novice
31. marts 2008 - 22:28 #6
ja men hvis du arbejder med data'en i memory og ikke på noget tidspunkt får gemt data ned i databasen.. så forstår jeg det heller ikke: )
medmindre jeg måske selv sad og rodede med det.

men vil ikke mene, at din viewstate hvis ikke du selv gemmer den bare sådan finder vej ned i din db.
Avatar billede jensen2005 Nybegynder
01. april 2008 - 07:31 #7
Det har ikke at gøre med db. Den skriver jeg til på et senere tidspunkt.

Jeg prøver at forstå konceptet viewstate --> at asp.net gemmer ændringer uden at jeg skriver --> ViewState["afd_DataTable"] = afdeling;

Her er et eksempel hvor det bare er session:
http://www.aspnettutorials.com/tutorials/controls/data-table-csharp.aspx

Venlig hilsen Jensen2005
Avatar billede kalp Novice
01. april 2008 - 08:32 #8
ja viewstate er en slags session, men lukker du en browser så er det jo glemt.
Det lyder som om det bliver husket hos dig fordi den gemmer i databasen.

måske er det mig som ikke helt har forstået dig:)
Avatar billede jydebjerg42 Nybegynder
19. september 2008 - 22:53 #9
Du behøves ikke at assigne dit dataset til viewstate igen fordi værdierne i viewstate først serialiseres til klienten i renderingsfasen og fordi at DataTable er en reference type. Når du 1. gang tildeler din DataTable instans til ViewState så er det ikke værdierne i din DataTable du putter i ViewState, men en reference til din DataTable. Når siden skal renderes til output strømmen så den kan sendes til klienten, så bliver ViewState også renderet (serialiseret). Uanset hvilke ændringer du har lavet til din DataTable fra du tildelte den til ViewState og til ViewState serialiseres så er det stadig en reference til din DataTable der ligger i ViewState og dine ændringer kommer derfor med.

//DataTable instantieres
DataTable table = new DataTable("Test");

//En reference (pegepind) til tabellen puttes i ViewState
ViewState["MyTable"] = table;

//Tilføj række til tabel
DataRow row = table.NewRow();
row["MyValue"] = "Value";
table.Rows.Add(row);

Når ViewState nu serialiseres ved afslutningen af postback'et så derefereres referencen til vores DataTable som nu indeholder en række og denne række kommer derfor med i output.
Avatar billede jensen2005 Nybegynder
21. juni 2011 - 16:08 #10
Lig et svar hvis i ønsker point.
Avatar billede jensen2005 Nybegynder
25. februar 2013 - 07:48 #11
Svar
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
Kurser inden for grundlæggende programmering

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