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

时间:2016-03-27 17:26:21

标签: c# .net webforms

我有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 webforms网页。有没有人知道我哪里出错?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

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

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

  • 创建一个包含值的类,并将其标记为可序列化
  • 将该类放入全局变量
  • 使用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; }
    }
    

答案 2 :(得分:1)

你应该保留回发后所有三个int字段的值,你可以通过查看状态或会话或隐藏字段保留你将在回发中获得,或者也可以在查询字符串中。