为什么我的计数器不会递增?

时间:2012-06-10 18:49:06

标签: c# asp.net session-state

我已经完成了一些C ++编程,但我是c#的新手。

我写了一个简单的应用来计算用户点击按钮的次数,然后在按钮上显示该次数。

在第一次点击它可以工作,但之后它保持在1.任何建议?提前致谢

public partial class Default : System.Web.UI.Page
{
    private int clickcount = 0;
    public virtual void button1Clicked (object sender, EventArgs args)
    {
        clickcount++;
        button1.Text = "You clicked me "+clickcount.ToString()+" time";
    }
    public virtual void GreetButtonClicked (object sender, EventArgs args)
    {
        GreetButton.Text = "Hello "+TextInput.Text;
    }
     }      

6 个答案:

答案 0 :(得分:4)

每次创建页面时,您都将计数设置为零。这样:

private int clickcount = 0;

几乎与此相同:

private int clickcount;

public Default()
{
    clickcount = 0;
}

由于每次请求页面时都会调用构造函数,因此您将始终将值重置为零。

你如何解决这个问题取决于你想要计算什么。例如,如果要计算当前会话中的点击次数,则应使用会话变量来存储计数。

我建议您阅读以下网页,以便更好地了解状态的存储位置以及最适合不同用途的存储类型:

答案 1 :(得分:2)

网页不会自动保留数据,因此clickcount的值仅保留在内存中,直到服务器完成页面渲染。下次单击该按钮时,计数器将重置为0.如果要在回发(页面加载)之间保留数据,则必须将数据存储在某处,例如Session,{{1}或在数据库中。

以下是一个示例,根据您的代码修改:

ViewState

答案 2 :(得分:1)

每次单击按钮时,

clickcount将设置为0,因为它在每次回发时都会初始化为您设置的值(在本例中为> 0)。如果你将它设为私有静态int,你会看到值实际上会增加。

    int counter = 0; <-- gets initialized to 0 on each click
    static int counter1 = 0; <--- gets incremented on each click, so 1,2,3 ...

正如在这个答案的评论中指出的那样: 如果您计划实际使用计数器,最好使用Session变量来存储单击按钮的次数。

答案 3 :(得分:1)

如果您不关心会话和其他类型的持久性,可以使用VIEWSTATE将此值保留在属性中。

像这样使用你的代码,这将有效:

public partial class Default : System.Web.UI.Page
{
    public int clickcount 
  {
   get
   {
     if(Viewstate["clickcount"] != null)
     {
      return (int)Viewstate["clickcount"]; //Need to cast the viewstate object in int.
     }
     else
     {
        return 0;
      }
  }
   set
   {
     Viewstate.add("clickcount",value);
   }
  }
    public virtual void button1Clicked (object sender, EventArgs args)
    {
        clickcount++;
        button1.Text = "You clicked me "+clickcount.ToString()+" time";
    }
    public virtual void GreetButtonClicked (object sender, EventArgs args)
    {
        GreetButton.Text = "Hello "+TextInput.Text;
    }
     }

答案 4 :(得分:0)

您应该将clickcount声明为静态变量。

答案 5 :(得分:0)

我认为有一种简单的方法可以解决这个问题

您可以添加新标签并使visible = false

然后代码就像

counter = int.parse(label.text);
counter++;
label.text = counter.ToString();
button.text = "you clicked me "+counter.ToString();