【问题标题】:Button Click counter + textbox按钮点击计数器+文本框
【发布时间】:2023-03-31 04:32:01
【问题描述】:

我是 C# 和 Visual Studio 的新手,我最近开始学习...目前我正在尝试制作一个可以计算点击次数的按钮和一个可以输入任意数字的文本框将在添加 1 时反映在按钮计数器中,现在它可以工作但我希望每次单击时按钮都添加 1,这是我的代码,

using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace MainWeb1
{
    public partial class ButtonCounter : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
            btn.Text = (TextBox1.Text);
            btn.Text = (Int32.Parse(btn.Text) + 1 ) .ToString();
            
           

        }

        protected void TextBox1_TextChanged(object sender, EventArgs e)
        {
            string var;
            var = TextBox1.Text;

        }
    }
}

【问题讨论】:

    标签: c# html asp.net


    【解决方案1】:

    您需要将按钮上的计数器与从文本框中获得的值分开,并使用更新后的值重新计算按钮文本。

    在 ASP.NET 中,只要发生需要回调服务器的事件,就会重新创建页面的类实例。如果您在页面构造函数中放置一个断点,您可以很容易地看到这种行为。

    因此,您需要在每次点击之间保持计数器状态的东西。有很多可能性,隐藏字段、静态变量或会话变量。

    使用静态变量的可能方法:

    public partial class ButtonCounter : System.Web.UI.Page
    {
        // keeps the count of the clicks on the button
        private static int btnCounter;
    
        protected void Page_Load(object sender, EventArgs e)
        {
            
        }
    
        protected void Button1_Click(object sender, EventArgs e)
        {
            btnCounter++;
            Button btn = (Button)sender;
            btn.Text = (Int32.Parse(TextBox1.Text) + btnCounter ) .ToString();
        }
    

    但是静态变量在 ASP.NET 应用程序中有一些麻烦的方面。它们在所有用户之间共享,因此新用户将看到来自另一个用户的点击达到的计数器值。如果出于某种原因,IIS 服务器需要回收应用程序池,则静态变量会丢失并从 0 重新启动。

    Session 是分配给当前用户的内存区域,人们可以在其中存储值或对需要保留直到会话结束的信息的引用。因此,通过 Session 变量的解决方案可能是

        protected void Button1_Click(object sender, EventArgs e)
        {
            int btnCounter = 0;
            if(Session["counter"] != null)
                counter = Int32.Parse(Session["counter"]);
            counter++;
            Session["counter"] = btnCounter;
    
            Button btn = (Button)sender;
            btn.Text = (Int32.Parse(TextBox1.Text) + btnCounter ) .ToString();
        }
    

    更简单的解决方案是使用 HiddenField 控件,您可以在其中保留计数器并或多或少地像上面的 Session 示例一样使用它。

        protected void Button1_Click(object sender, EventArgs e)
        {
            int btnCounter = Int32.Parse(hiddenCounter.Text);
            btnCounter++;
            hiddenCounter.Text = btnCounter.ToString();
    
            Button btn = (Button)sender;
            btn.Text = (Int32.Parse(TextBox1.Text) + btnCounter ) .ToString();
        }
    

    这将起作用,因为 ASP.NET 为页面中的所有控件保留了 ViewState,并使用以前的值重新初始化它们(这并不像看起来那么好,因为它增加了需要在服务器和客户端)

    如果您仍然想使用 ASP.NET,那么了解 ASP.NET Page Life cycle 至关重要,但请记住,这对于 Microsoft 来说是一项过时的技术。所有新的增强都在 ASP.NET Core 和新的编程模型(如 ASP.NET MVC 和 ASP.NET Razor 页面)领域。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 2017-06-28
      • 1970-01-01
      相关资源
      最近更新 更多