增加一个 int++ 不会超过 1

Incrementing an int++ doesn't go past 1

我有 3 个整数,它们应该在单击按钮时递增,然后它们的值被转换为字符串并在对应的标签上更新,但它们永远不会递增超过 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();
        }

    }

这适用于 ASP.NET 网络表单网页。有人看到我哪里出错了吗?

照原样,每次加载页面时,您都将变量初始化为零。所以在第一次递增之后,它会回到零,解释为什么它永远不会递增超过 1。请参阅 ScottHannen 的回答,因为它更适合解释如何解决这个问题。

您应该保留 post 后面所有三个 int 字段的值,您可以通过视图状态或会话或隐藏字段保留 ot,您将在 post 后面获得,或者也可以是在查询字符串中。

即使您将变量初始化为全局变量,它们仍将重置为零,除非它们以某种方式持久化。

有几种方法可以做到这一点。

  • 您可以创建 <asp:hidden runat="server"> 元素并将值存储在其中。这可能是最简单的。
  • 您可以在 PreRender 事件期间将值存储在 ViewState 中,并在 Load 事件中再次检索它们。

在这两种情况下,确保将值输出到页面,这意味着它们将通过任何回发事件发送回服务器。为简单起见,我只使用隐藏的表单元素。但是如果有任何类型的复杂数据,那么我

  • 创建一个包含值的 class,并将其标记为可序列化
  • 将class放入全局变量
  • Load 事件中从 ViewState 恢复变量
  • 将其保存在 PreRender 事件中。

    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; }
    }