Hallo,
ich bin gerade dabei meinen Einstieg in die Webentwicklung mit .NET / C# / OOP zu finden und habe es offensichtlich noch nicht so ganz verstanden. 😉
Ich habe testweise mal eine ganz einfache Web Form erstellt, auf der sich ein Button und ein Label befinden.
Nun wollte ich gerne, dass mit jedem Klick auf den Button ein Integer (i) hochgezählt und in der Label-Box angezeigt wird.
Leider scheint aber jedesmal die Variable zurückgesetzt zu werden, wenn man auf den Button klickt, denn der Wert von i
bleibt immer 1, egal wie oft man auf den Button klickt.
So sieht der Code aus:
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
public partial class _Default : System.Web.UI.Page
{
int i = 0;
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
i++;
Label1.Text = Convert.ToString(i);
}
}
Ich habe tatsächlich Stunden verbracht hinter den Fehler zu kommen, aber leider keinen Erfolg gehabt.
Warscheinlich liegt es dadran, dass ich bisher kaum Kontakt mit objektorientierter Programmierung hatte und irgendwas grundsätzlich falsch mache.
Auf jedenfall würde ich dieses Problem gerne verstehen, bevor ich mich komplexeren Aufgaben zuwenden kann.
Ich wäre daher über Hilfe sehr dankbar!
mfg Electric-Ric
das liegt an der arbeitsweise von asp.net. eine web-form hat keinen zustand, das heisst sie lebt nur in der zeit zwischen der http anfrage und der rückantwort des servers. deshalb wird die klasse bei jeder anfrage neu erstellt und i auf den startwert zurück gesetzt. wenn du oop lernen willst, solltest du nicht mit web-forms anfangen sondern mit einfachen sachen wie konsolenanwendungen.
Bei Webseiten funktioniert das ein wenig anders. Du musst die Variable irgendwo zwischenspeichern (Session, Cookie,...).
Da fehlt es noch an Grundlagen 🙂
P.S. es gibt hier auch ein extra forum dafür.
Eventuell könnte man auch das Label in ein AJAX UpdatePanel einbetten und so "hochzählen".
Gruß
Servus, versuchs doch mal so....
Denn wenn der Wert von i zwischen gespeichert wird und dann beim klick hochgezählt wird dann steigt der Wert auch.
public int DeinInt
{
get
{
object o = ViewState["DeinInt"];
return (o == null) ? "falls wert nich gesetztl" : (int)o;
}
set { ViewState["DeinInt"] = value; }
}
protected void Button1_Click(object sender, EventArgs e)
{
DeinInt = +1;
Label1.Text = DeinInt.ToString();
}
Im Idealfall funktioniert das so, sorry fals ein Fehler drinen sein sollte, bin seit 35 Stunden auf.... Da is das mit dem genauen so eine Sache aber bin mir sicher Peter korrigiert das sollte hier einen Fehler drinnen haben.....
Gruß
Siggi
Wenn dus ganz einfach haben willst kannst du auch einfach ein HiddenField setzen, deinen wert da rein schreiben und nach jedem postback wieder auslesen
mfg Alex
Hmh Alex,
was meinste denn was der Viewstate so macht.
Nix anderes, auser das er den Wert verschlüsselt darstellt.... 😉
Hey, erstmal vielen Dank für die zahlreichen Antworten!
Hab ich echt nicht gerechnet, nachdem ich hier so eine peinliche Frage gepostet habe.
Ok soweit habe ich verstanden, dass ich entweder einen Viewstate oder Sessionstate einbauen muss, um den Zustand von Variablen erhalten zu können.
Nun wüsste ich natürlich gerne wie man mit Viewstates arbeitet, habe auch den Code von gosiggi ausprobiert, aber leider gibt es in der Zeile ein Problem:
return (o == null) ? "falls wert nich gesetzt" : (int)o;
Der Kompiler meint dazu:
Der Typ des bedingten Ausdrucks kann nicht bestimmt werden, weil keine implizite Konvertierung zwischen "string" und "int" erfolgt.
So wie ich die Zeile verstehe wird überprüft ob o leer ist und dann ggf. o als int initialisiert. Der String "falls wert nicht gesetzt" ist dann vermutlich eine mögliche Fehlermeldung. Wieso kommt aber der Kompilerfehler? Der Kompiler erwartet doch nicht anstelle des Fehlermeldungs-Strings einen Integer??
Und verstehe ich das richtig, dass wenn ich einmal die get u. set Methoden für eine Variable definiert habe, ich die Variable im restlichen Code ganz normal benutzen kann und sie automatisch im Viewstate hinterlegt wird?
EDIT: Bin dahinter gekommen, dass "falls wert nicht gesetzt" ist ein Platzhalter für den Initialisierungswert der neuen Variable. 😁
Im Falle eines Integer, den man mit dem Wert 0 deklarien möchte, würde die Zeile also so aussehen:
return (o == null) ? 0 : (int)o;
Damit kann ich mir jetzt den Viewstate zu nutze machen. Ist ja eigentlich ganz einfach. 🙂
Der Thread hat sich damit erledigt. Vielen Dank nochmal!
Gruß Electric-Ric
Oh Sorry das ich dir das nich geändert hatte.
Diente aber auch eher als Hinweis wo was hinkommt, weniger dazu den string auf einen Int anzuwenden....
Hauptsache ist aber das es dir weiter geholfen hat....
Hallo zusammen
Siehe:
was meinste denn was der Viewstate so macht.
Nix anderes, auser das er den Wert verschlüsselt darstellt.... 😉
Wie mans auffasst.
Schlussendlich ist viel mehr dahinter.
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011