增加一个 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; }
}
我有 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; } }