hej casualty :o)
det er fordi dit viewstate genereres udfra en kontrols nuværende tilstand, og det bliver ikke ændret fra du har smidt siden ud til klienten, og til du modtager den igen.
når du kommer tilbage på serveren - vil der derfor i dit viewstate stå hvad værdien var på det tidspunkt du sendte kontrollen ud sidst, hvilket så kan bruges til at udlede om der er sket ændringer.
prøv at kig lidt på nedenstående eksempel (det er VS-stil - håber det er det du bruger).
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace EXP2.ViewState
{
public class Samples : System.Web.UI.Page
{
protected HtmlForm Form1;
private void Page_Load(object sender, System.EventArgs e)
{
// en textbox
TextBox tb = new TextBox();
// tb.EnableViewState = false;
tb.TextChanged += new EventHandler(tb_TextChanged);
Form1.Controls.Add(tb);
// bare en knap så der kan laves et postback
Button b = new Button();
Form1.Controls.Add(b);
}
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
private void tb_TextChanged(object sender, EventArgs e)
{
Response.Write("ÆNDRET");
}
}
}
Ovenstående vil sikre, at du får fyret dit change-event hver gang der ændres i tekstboksen, og årsagen til det er, at når viewstate loades, vil kontrollen blive fundet i viewstate og det kan udledes at der er sket en ændring -> Eventet fyres.
Hvis du kommenterer denne linie ind :
tb.EnableViewState = false;
Vil du kunne observere følgende (måske lidt overraskende).
Når dit viewstate loades, vil der ikke kunne findes oplysninger om kontrollen, og det vil kontrolleres om indholdet som det kan ses af det data der er postet, at tekstboksen værdi er ændret -> eventet fyres.
Men..... den værdi der sammenlignes med, er så den værdi som tekstboksen har efter page_load er kørt.
Dette vil så igen sige... at du får fyret dit changed-event HVER gang du poster siden til serveren, hvis bare der står et eller andet i boksen.... dvs. skriver du f.eks. hej i boksen første gang du ser den, vil du få fyret eventet og der vil fortsat stå hej i boksen.
hvis du klikker på knappen gentagne gange efter dette vil du stadig få fyret eventet hver gang.
(der vil jo være en ændring fra en tom streng og til hej... set fra serverens side).
Det hele bunder i frameworket, og en side/kontrol processeres - du kan se en oversigt her :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcontrolexecutionlifecycle.aspForklaringen på at eksemplet virker på den beskrevne når EnableViewState=true er, at LoadPostData(står i oversigten i linket ovenfor) kunne se sådan her ud :
(loadpostdata køres på bl.a. teksbokse da de implementerer et interface der hedder IPostBackDataHandler).
Dette er også forklaringen på - at du har du det som brugeren har skrevet ind i tekstboksen liggende i .Text-property'en.
public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) {
// det aktuelle indhold af (i dette tilfælde) tekstboksen
string presentValue = Text;
// den værdi der kommer fra det postede data.
string postedValue = postCollection[postDataKey];
// hvis de ikke er ens - er der sket en ændring
if (!presentValue.Equals(postedValue)){
Text = postedValue; // her sættes teksten til det der er postet.
return true;
}
// og ellers er der ikke
return false;
}
frameworket holder styr på at der er returneret true fra den givne kontrol, og vil senere kalde RaisePostDataChangedEvent, som for en tekstboks kunne være være implementeret som noget i denne stil :
public virtual void RaisePostDataChangedEvent()
{
OnTextChanged(...);
}
og metode OnTextChanged for en tekstboks, vil så igen fyre Changed-event, og vil se ud som noget i denne stil :
protected virtual void OnTextChanged(EventArgs e)
{
if(Changed!=null)
Changed(this, e);
}
og det er så det der gør at eventet fyres (eller rettere... at du får kaldt den metode du har angivet da du wirede eventet).
Udover linket til MSDN kan du lige få det her :
(Det er en smule langhåret, men der står nogle meget gode ting omkring det)
http://www.codeproject.com/aspnet/PersistentStatePage.aspNå.... det blev måske lidt tågesnaksagtigt.... Jeg håber at jeg ikke har formuleret mig fuldstændig uforståeligt - og at du kunne bruge det til et eller andet.
(der er lidt spøgelser i den slags, som du ikke kan læse af codeprojekt-linket ;o)
mvh