webForumDet fria alternativet

sessionsvariabler

18 svar · 547 visningar · startad av Prästen

PrästenMedlem sedan dec. 2000537 inlägg
#1

hur skapar man en session variabel?.

tex när jag gjorde en funktion som skulle steppa fram nästa post i datasetet när man trycker på en knapp och då använda jag en:

void getcontent() {
System.Data.DataSet mittDataset=new System.Data.DataSet();
MyQueryMethod(mittDataset, "SELECT [person].[fornamn], [person].[efternamn], [person].[gatunamn], [person].[postnummer], [person].[postort], [person].[ID] FROM [person]");
}

void Button1_Click(Object sender, EventArgs e) {
nummer++;
getcontent();
TextBox1.Text=mittDataset.Tables["Table"].Rows[nummer]["fornamn"].ToString();
}

(nummer deklarerades utanför alla funktioner)
(MyQueryMethod() är en metod som returnerar ett dataset i sitt argument)

så funkade inte det, den steppade bara fram nästa post och sen gick det inte att steppa fram nästa. men var det inte tänkt så med webcontrols och ASP.NET att ASP.NET skulle likna windowsprogrammering,. det verkar ju inte funka i så fall ifall man måste använda sessioner och annat gojs.

cyprysMedlem sedan dec. 20003 563 inlägg
#2

nummer += 1 ?

JosefMedlem sedan mars 20023 561 inlägg
#3

Varför binder du inte datasetet till textboxen istället?

PrästenMedlem sedan dec. 2000537 inlägg
#4

naj det funkade inte förstår du, nummer++; är samma sak som
nummer+=1; och nummer=nummer+1;. det verkar inte som nummer behåller sitt värde, när man trycker på knappen.

PrästenMedlem sedan dec. 2000537 inlägg
#5

binder?

JosefMedlem sedan mars 20023 561 inlägg
#6

Ja, att du har ett dataset och sedan sätter:

Textbox1.DataSource = ds.Tables["[i]tabell[/i]"].DefaultView;
[b]TextBox1.DataBind()[/b];
PrästenMedlem sedan dec. 2000537 inlägg
#7

funkar ju inte:

Compiler Error Message: CS0117: 'System.Web.UI.WebControls.TextBox' does not contain a definition for 'DataSource'

TextBox1.DataSource=mittDataset.Tables["Table"].DefaultView;
TextBox1.DataBind();

TextBox har ju ingen egenskap som heter DataSource, inte ärvd heller, kollade i .doc:en. eller har den det? och vad ska man ha den till, hur funka den?.

nikoMedlem sedan juni 20022 599 inlägg
#8

det verkar inte som nummer behåller sitt värde, när man trycker på knappen

Nej, varje gång sidan träffas så skapas en ny instans av sidans klass och nummer förlorar sitt värde. Fast om du deklarerar nummer som:

private static nummer=0;

så borde du se en intressant effekt (dock inte exakt den du strävar efter).

Det fungerar mao precis som i Windowsprogrammering.

PrästenMedlem sedan dec. 2000537 inlägg
#9

aha coolt. men det där med databind då, det funkade inte, och vad menade han?

PrästenMedlem sedan dec. 2000537 inlägg
#10

men du, sidan laddas väl inte om helt om jag bara satt en liten händelsehanterare på en knapp väl?

GladhMedlem sedan maj 20012 812 inlägg
#11

Jodå!

Varje händelse genererar en ny förfrågan till servern. Eftersom ASP.NET körs på servern och resultatet skickas som HTML till klienten så måste varje händelse köras på servern och sedan skicka resultatet till webklienten.

- M

PrästenMedlem sedan dec. 2000537 inlägg
#12

så allt raderas då?, alla variablerna och sånt?. uuh

PrästenMedlem sedan dec. 2000537 inlägg
#13

ok, databind på ett TexBox objekt funkar det och i så fall hur?

PMedlem sedan jan. 20012 204 inlägg
#14

Nej du skriver textbox.text så visas text.

Om du laddar data till en textbox i page load och sen har en knapp som ska utföra något med värdet i textboxen, vilket kan vara ändrat, så får du det värde som laddas. Lägg till

if not ispostback then
'load data
end if
PrästenMedlem sedan dec. 2000537 inlägg
#15

men vad var det josef menade då?, kolla ovanför?

GladhMedlem sedan maj 20012 812 inlägg
#16

Det stämmer att ALL data för din sida kommer att raderas.

Dock är det så att när du gör din förfrågning mot servern så kommer viss data att skickas med automatiskt. Det är dels alla de input fält som du har (textboxar, checkboxar, valda värden i dropdownlistor osv osv) du gör ju en submit till servern.

Dels så kan man lagra information om sina server-controls i något som heter viewstat. Om du binder ett stor DataSet till en DataGrid och visar det på din sida, så kan du i HTML-koden se en lång krypterard sträng. Det är din viewstat, alltså information om vilka kontroller som har vilket värde.

Detta gör att du inte behöver fråga din databas varje gång efter data att fylla typ en DropDownList med 4 olika färger, du gör det en gång och sedan håller viewstaten all den datan till dig och skriver ut dessa fyra färger i dropdownlistan varje gång som du laddar om sidan.

Nu är inte viewstaten endast av godo (även om man kan tro det) eftersom om du har MYCKET data som binds på din sida, så kommer du få mycket data som skickas från servern->klienten och sedan från klienten->servern. Så om du har en dålig lina så skickar du en massa data som du kanske inte har tillräckligt med kapacitet för. Så därför skall man stänga av viewstaten på sina sidor om man inte behöver denna data.

Dock är det så att variabler inne i din VB/C# kod inte kommer att placeras i din viewstat eftersom de inte tillhör någon servercontroll och dessa försvinner varje gång sidan laddas om. Nu kan man dock (som nämnts tidigare) behålla ett värde med hjälp av static, men då kommer du få samma värde för alla dina sidor och inte olika för olika besökare, ungefär som Application-variabler.

- M

DinoMedlem sedan sep. 20011 914 inlägg
#17

Du kan utnyttja viewstaten för att spara ett värde mellan postbacks..

grr = "någon data"
viewstate("grr") = grr

Red// Gladh förklarade ju just detta. :)

PrästenMedlem sedan dec. 2000537 inlägg
#18

hur sätter jag på en Viewstate på tex ett dropdownlist?.

så att den är aktiv så att den bara hämtar 1 gång från databasen oavsett hur många gånger sidan laddas om.

GladhMedlem sedan maj 20012 812 inlägg
#19

viewstaten är som default aktiv.

Du skall alltså inte göra något för att din sida skall visa din dropdownlista.

Dock måste du ju fylla den första gången man kommer in på sidan, och sedan nästa gång (postback) så skall du inte fylla den, eftersom viewstaten innehåller alla värden.

så alltså måste du kolla i din Page_Load() om det är första gången sidan körs Page.IsPostBack = false och så fall hämta data från databasen, nästa gång sidan körs så kommer Page.IsPostBack vara True och då skall du INTE hämta någon data. Typ så här:

private void Page_Load(object sender, System.EventArgs e){
 if(!Page.IsPostBack){
  //-- Hämta data från databasen
 }
}

- M

126 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
123 ms — hämta tråd, inlägg och bilagor (db)