C# 反赢';t单击一次后增加一次以上
我有一个计数器,onclick应该递增1,它在单击时递增,但如果我再次单击按钮,它将不会再次递增。相反,它将停留在1。如果按钮被多次单击,我如何使其上升C# 反赢';t单击一次后增加一次以上,c#,asp.net,C#,Asp.net,我有一个计数器,onclick应该递增1,它在单击时递增,但如果我再次单击按钮,它将不会再次递增。相反,它将停留在1。如果按钮被多次单击,我如何使其上升 protected void submitAnswerButton_Click(object sender, EventArgs e) { int counter = 0; if (mathAnswerTextBox.Text == answer.ToString()) { answer
protected void submitAnswerButton_Click(object sender, EventArgs e)
{
int counter = 0;
if (mathAnswerTextBox.Text == answer.ToString())
{
answerStatus.Text = "Correct!";
}
else if (mathAnswerTextBox.Text != answer.ToString())
{
answerStatus.Text = "Incorrect";
counter++;
if (counter == 1)
{
incorrectStrikes.Text = counter.ToString();
}
else if (counter == 2)
{
incorrectStrikes.Text = counter.ToString();
}
else if (counter == 3)
{
incorrectStrikes.Text = counter.ToString();
}
}
您需要使
计数器
位于方法之外,例如类中的,而不是局部变量:
private int counter = 0;
protected void submitAnswerButton_Click(object sender, EventArgs e)
{
if (mathAnswerTextBox.Text == answer.ToString())
{
answerStatus.Text = "Correct!";
...
由于这是一个web应用程序,您可能希望将计数器存储在中,例如:
内部页面加载:
if(!IsPostback)
{
Session["AttemptCount"] = 0
}
然后在里面
protected void submitAnswerButton_Click(object sender, EventArgs e)
{
int counter = (int)Session["AttemptCount"];
if (mathAnswerTextBox.Text == answer.ToString())
{
answerStatus.Text = "Correct!";
...
//Make sure you include this on all paths through this method that
//affect counter
Session["AttemptCount"] = counter;
目前,您的计数器是一个局部变量(如下代码所示),因此每次单击按钮,它都会初始化为0
,因此每次都会得到1
,因为它会增加一次
protected void submitAnswerButton_Click(object sender, EventArgs e)
{
int counter = 0;
您需要将值存储在更全局的上下文中,例如,或者甚至可能是用于存储值的
结论:Web是无状态的,所以您需要一个状态管理器
protected void submitAnswerButton_Click(object sender, EventArgs e)
{
var counter = this.ViewState["foo"] as int; // read it from the ViewState from the previous request, or set it to default(int) = 0 with as
// ... do your routine
this.ViewState["foo] = counter; // write it back to store it for the next request
}
无论如何,这只在您无状态的web上下文中有效
如果您在webform/wpf上下文中,您更愿意使用简单的静态
,或实例变量,或。。。(无论什么适合您当前的需要,架构,…)将int计数器
移到方法之外。@Sayse我怀疑这是否是解决方案。实例成员和静态成员之间仍然存在差异…@AndreasNiedermair-这与它有什么关系同样,你可能希望阅读此-@Sayse再次阅读问题:“但如果我再次单击按钮,它将不会再次递增。”。。。因此,您需要一个与线程无关的值,并以某种方式将后续单击附加到正确的实例(例如ThreadStatic,它在web上下文中不起作用)@AndreasniederMir-我们不知道OP正在构建哪种类型的应用程序。他们的术语可能会被解释为表明这是一个web应用程序,但这并不确定(如果是,那么Session
显然是解决问题的最佳选择)@Sayse我怀疑这是否是解决方案。实例成员和静态成员之间仍然存在差异。静态代码存在线程上下文(以及后续线程上下文…)的问题@Andreasniedermir,OP没有提到这段代码所使用的上下文。如果OP使用ASP.NET(正如Damien正确指出的那样),那么他可以使用任何状态管理(最好是会话)来管理它(或者,如果他使用Winform),那么可能会声明一个静态变量。您更愿意描述“缺点”会话类型:它适用于浏览器实例的每个选项卡,您无法区分它们-因此具有多个选项卡的用户将交叉更新值-一个选项卡执行POST,而另一个选项卡执行GET将导致在每个GET请求中重置会话值。。。