Laden...

[gelöst] Variablen in Web-Forms so deklarieren, dass der Wert erhalten bleibt

Erstellt von electricric vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.814 Views
E
electricric Themenstarter:in
2 Beiträge seit 2008
vor 15 Jahren
[gelöst] Variablen in Web-Forms so deklarieren, dass der Wert erhalten bleibt

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

F
722 Beiträge seit 2005
vor 15 Jahren

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.

M
334 Beiträge seit 2007
vor 15 Jahren

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.

J
257 Beiträge seit 2008
vor 15 Jahren

Eventuell könnte man auch das Label in ein AJAX UpdatePanel einbetten und so "hochzählen".

Gruß

129 Beiträge seit 2007
vor 15 Jahren

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

A
5 Beiträge seit 2008
vor 15 Jahren

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

129 Beiträge seit 2007
vor 15 Jahren

Hmh Alex,

was meinste denn was der Viewstate so macht.
Nix anderes, auser das er den Wert verschlüsselt darstellt.... 😉

E
electricric Themenstarter:in
2 Beiträge seit 2008
vor 15 Jahren

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

129 Beiträge seit 2007
vor 15 Jahren

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....

5.942 Beiträge seit 2005
vor 15 Jahren

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.

  • Serverseitige API für das Handling damit
  • Automatische Statuserhaltung mithilfe der API
  • Automatisches einfügen eines HiddenFields

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011