【问题标题】:Increment number per button click C# ASP.NET [duplicate]每个按钮单击的增量数 C# ASP.NET [重复]
【发布时间】:2012-04-15 15:28:17
【问题描述】:

可能重复: Button click event doesn't work properly

我尝试为默认页面上的每次点击增加一个 int。 Int=0。它只上升到 1。我应该怎么做才能增加每次点击的数字?

public partial class _Default : System.Web.UI.Page
{
    private int speed = 0;

    public int Speed
    {
        get { return speed; }  // Getter
        set { speed = value; } // Setter
    }

    public void accelerate()
    {
        //speed++;
        this.Speed = this.Speed + 1;
    }

    public void decelerate()
    {
        // speed--;
        this.Speed = this.Speed - 1;
    }

    public int showspeed()
    {
        return this.Speed;
    }

    //car bmw = new car();
    public void Page_Load(object sender, EventArgs e)
    {
        //datatype objectname = new

       dashboard.Text = Convert.ToString(this.showspeed());
    }

    public void acc_Click(object sender, EventArgs e)
    {
       this.accelerate();
       dashboard.Text = Convert.ToString(this.showspeed());
    }

    public void dec_Click(object sender, EventArgs e)
    {
        this.decelerate();
        this.showspeed();
    }
}

【问题讨论】:

标签: c# asp.net visual-studio increment


【解决方案1】:

您可以使用ViewState 来维护跨回发的值:

private int Speed
{
   get
   {
       if (ViewState["Speed"] == null)
           ViewState["Speed"] = 0;
       return (int)ViewState["Speed"];
   }
   set { ViewState["Speed"] = value; }
}

【讨论】:

    【解决方案2】:

    您需要以一种在回发过程中持续存在的方式存储结果。我建议使用 ViewState,例如:

    public int Speed
    {
        get { 
            if(ViewState["Speed"] == null) {
                 ViewState["Speed"] = 1;
            }
            return Convert.ToInt32(ViewState["Speed"]);
         }
    
        set { 
             ViewState["Speed"] = value;
        }
    }
    

    【讨论】:

    • 我觉得速度从0开始比较好
    【解决方案3】:

    因为每次点击按钮时,都会将speed的值初始化为0。

    HTTP 是无状态的。这意味着它不会像在Windows Forms 编程中那样在您的回发中保留变量的值。所以你需要在你的回发中保持价值。

    您可以在页面中使用隐藏元素来存储值并在每次想要对其执行功能时访问该值:

     <asp:HiddenField ID="hdnFileId" runat="server" Value="" />
    

    在您的页面加载中,您可以读取该值并将其加载到您的变量中。

    public void Page_Load(object sender, EventArgs e)
    {
        this.speed = ConvertTo.Int32(hdnFileId.Value);
    }
    

    来自Adrianftode's 的评论,文本框、复选框、单选按钮控件值等控件的数据将在回发时发布到服务器,因为它们在浏览器中呈现为标准 HTML 表单控件。请参阅Chapter 4. Working with ASP.NET Server Controls

    【讨论】:

    • 输入的值不需要通过视图状态来维护。为什么应该是,如果它每次都来回传递?
    • @AdrianIftode:因为 hTTP 是无状态的。典型输入字段中的值在回发时将不可用。所有 ASP.NET 控件都在内部使用 ViewState 在回发期间保留值
    • 我确定这个语句对输入无效,我解释了原因
    • @AdrianIftode:在这种情况下,OP 希望在每个按钮单击事件上获取先前更新的值以再次更新它。对于隐藏控件,asp.net 在内部使用 viewstate 来保留值。我相信(以前保存的)值应该在按钮单击事件中可用
    • @AdrianIftode:我明白你的意思。你说的完​​全正确。msdn.microsoft.com/en-us/library/gg615475(v=vs.88).aspx。我会更新我的答案。这是我今天学到的东西。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多