Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反赢';t单击一次后增加一次以上_C#_Asp.net - Fatal编程技术网

C# 反赢';t单击一次后增加一次以上

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

我有一个计数器,onclick应该递增1,它在单击时递增,但如果我再次单击按钮,它将不会再次递增。相反,它将停留在1。如果按钮被多次单击,我如何使其上升

 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请求中重置会话值。。。