2016-03-27 11 views
1

Ich habe 3 Ints, die beim Anklicken der Schaltfläche inkrementieren sollen, und dann werden ihre Werte in Strings umgewandelt und auf einem Co-Label aktualisiert, aber sie werden nie über 1 inkrementiert.Inkrementieren eines int ++ geht nicht über 1

public partial class MainPage : System.Web.UI.Page 
{ 
    Random rd = new Random(); 
    int oneint = 0; 
    int twoint = 0; 
    int threeint = 0; 


    protected void Button1_Click(object sender, EventArgs e) 
    { 
     int rn = rd.Next(1, 1000); 

     if (rn > 1 && rn < 50) 
     { 
      Label1.Text = "3"; 
      threeint++; 
      threelbl.Text = threeint.ToString(); 
     } 

     if (rn > 50 && rn < 500) 
     { 
      Label1.Text = "2"; 
      twoint++; 
      twolbl.Text = twoint.ToString(); 
     } 

     if (rn > 500 && rn < 1000) 
     { 
      Label1.Text = "1"; 
      oneint++; 
      onelbl.Text = oneint.ToString(); 
     } 

    } 

Dies ist für eine ASP.NET Webforms-Webseite. Weiß jemand, wo ich falsch liege?

+0

'soll erhöht werden, wenn die Taste clicked' ist und nur dann, wenn RN in einem gewissen Bereich ist – Plutonix

+0

Jedes Mal, laden Sie die Seite Ihrer ints auf Null initialisiert werden. – Eser

+0

Werfen Sie einen Blick auf http://stackoverflow.com/questions/10838426/variable-initialized-in-class-losses-its-previous-value-with-the-page-loading –

Antwort

2

Auch wenn Sie die Variablen als globale Variablen initialisieren, werden sie immer noch auf Null zurückgesetzt, wenn sie nicht irgendwie beibehalten werden.

Es gibt ein paar Möglichkeiten, dies zu tun.

  • Sie könnten <asp:hidden runat="server"> Elemente erstellen und die Werte in diesen speichern. Das ist wahrscheinlich am einfachsten.
  • Sie können die Werte in ViewState während des Ereignisses PreRender speichern und im Ereignis Load erneut abrufen.
  • In beiden Fällen wird sichergestellt, dass die Werte auf der Seite ausgegeben werden. Dies bedeutet, dass sie mit jedem Postback-Ereignis zurück an den Server gesendet werden. Der Einfachheit halber verwende ich einfach die versteckten Formularelemente. Aber wenn es irgendeine Art von komplexen Daten dann

    I
    • eine Klasse erstellen, die Werte enthält, und markieren Sie ihn als serializable
    • setzte diese Klasse in einer globalen Variablen
    • wiederherstellen die Variable aus Viewstate mit in den Load Ereignis
    • speichern Sie es im PreRender Ereignis.

      public partial class MainPage : System.Web.UI.Page 
      { 
          Random rd = new Random(); 
          private PageState _pageState; 
      
          protected void Page_Load(object source, EventArgs e) 
          { 
           _pageState = ViewState["pageState"] as PageState ?? new PageState(); 
          } 
      
          protected void Page_PreRender(object sender, EventArgs e) 
          { 
           ViewState["pageState"] = _pageState; 
          } 
      
          protected void Button1_Click(object sender, EventArgs e) 
          { 
           int rn = rd.Next(1, 1000); 
      
           if (rn > 1 && rn < 50) 
           { 
            Label1.Text = "3"; 
            _pageState.threeint++; 
            threelbl.Text = _pageState.threeint.ToString(); 
           } 
      
           if (rn > 50 && rn < 500) 
           { 
            Label1.Text = "2"; 
            _pageState.twoint++; 
            twolbl.Text = _pageState.twoint.ToString(); 
           } 
      
           if (rn > 500 && rn < 1000) 
           { 
            Label1.Text = "1"; 
            _pageState.oneint++; 
            onelbl.Text = _pageState.oneint.ToString(); 
           } 
          } 
      } 
      
      [Serializable] 
      public class PageState 
      { 
          public int oneint { get; set; } 
          public int twoint { get; set; } 
          public int threeint { get; set; } 
      } 
      
    2

    So initialisieren Sie die Variablen bei jedem Laden der Seite auf Null. Nach dem ersten Inkrement wird es auf Null zurückgehen und erklären, warum es nie über 1 hinausgeht. Siehe ScottHannens Antwort, da es viel besser ist, zu erklären, wie man das umgeht.

    +1

    Stellen Sie sich ein Webformular als eine Klasse vor, die bei jeder Anfrage für diese Seite instanziiert wird. Es "weiß" nichts über frühere Anfragen. Es speichert eine Instanz dieser Seite nicht zwischen Anforderungen. Deshalb gibt es Viewstate. Informationen über den aktuellen Status werden auf die Seite geschrieben. Wenn der Benutzer ein Postback ausführt, sendet er alle diese Daten zurück an die Seite, so dass es sich "erinnern" kann, was der Status war. Serversteuerelemente werden standardmäßig gespeichert, die Variablen jedoch nicht. Wenn Sie sie beibehalten wollen, müssen Sie es selbst tun. –

    +0

    Sie haben völlig Recht, mein Fehler. Ich werde meine Antwort bearbeiten. –

    1

    Sie sollten den Wert aller drei int-Felder über Post zurück behalten, können Sie ot durch Ansicht Zustand oder Sitzung oder verstecktes Feld, die Sie in Post zurück erhalten, oder auch in Query String.

    Verwandte Themen