【问题标题】:C# My counter does not work [closed]C#我的计数器不起作用[关闭]
【发布时间】:2013-11-12 11:14:50
【问题描述】:

您好,谁能帮助我不知道为什么我的按钮中的计数器无法正常工作,对所有其他代码感到抱歉。我想通过使用计数器来构建数据库中的数据。如果有更简单的方法也可以。

public partial class _Default : System.Web.UI.Page
{
    int iDefualt = 2;
    int iMainCounter = 0;
    SqlConnection con1 = new SqlConnection("Data Source=EON;Initial Catalog=DW2;Persist Security Info=True;User ID=Kapow;Password=Kapow");
    DataTable dt = new DataTable();              

    public void Page_Load(object sender, EventArgs e)
    {
        con1.Open();
        SqlDataReader myReader = null;
        //SqlCommand myCommand = new SqlCommand("select * from customer_registration where username='" + Session["username"] + "'", con1);
        SqlCommand myCommand = new SqlCommand(sNavigate(0), con1);
        /SELECT * FROM tblDW2 WHERE [User]='Petrus'
        myReader = myCommand.ExecuteReader();

        while (myReader.Read())
        {
            txtbxDaywords.Text = (myReader["Dayword"].ToString());
        }
        con1.Close();    
        iMainCounter = iDefualt;
        // "Daywords\t" + "\n" + DateTime.Now.ToString();
    }
    public string sNavigate(int iNavNum)
    {
        int iNavigate;

        if (iNavNum != 0)
        {
            iNavigate = iNavNum;    
        }
        else
        {                    
            iNavigate = iDefualt;
        }        
        return "SELECT * FROM (SELECT Dayword, ROW_NUMBER() OVER (ORDER BY Dayword) AS      Rownumber FROM tblDW2 WHERE [User]='Petrus' ) results WHERE results.Rownumber = "+ iNavigate.ToString();
    }    
    protected void btnNext_Click1(object sender, EventArgs e)
    {
        iMainCounter++;    
        con1.Open();
        SqlDataReader myReader = null;
        SqlCommand myCommand = new SqlCommand(sNavigate(iMainCounter), con1);
        myReader = myCommand.ExecuteReader();    
        while (myReader.Read())
        {
            txtbxDaywords.Text = (myReader["Dayword"].ToString());
        }
        con1.Close();
    }
}

【问题讨论】:

  • 尝试给他 private const int 类型
  • 您应该尝试确定您的问题。准备一个只有按钮和计数器的“最小可编译示例”。
  • private const int 不行,它的 const,使用 private static int
  • 进一步研究 asp.net 的工作原理

标签: c# asp.net counter


【解决方案1】:

根据 ASP.NET 页面生命周期,当您在任何事件中初始化任何变量时,可能是页面加载或任何其他事件。初始化是特定于用户的 并且一旦事件被触发就会重新初始化。

解决方案:

如果您希望全局保存计数器(不特定于用户):使用应用程序变量保存计数器值

如果您希望保留特定于用户的计数器(针对整个应用程序中的特定用户):使用 Session 来保留计数器值

如果您需要示例代码,请告诉我,以便我提供。

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

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        if (Session["Incrementer"] == null)
        {
            Session["Incrementer"] = "1";
        }
        else
        {
            int incrementer = Convert.ToInt32(Session["incrementer"].ToString()) + 1;
            Session["incrementer"] = incrementer.ToString();
        }
        Label1.Text = Session["incrementer"].ToString();
    }
}

【讨论】:

  • 谢谢,我想这就是我想做的。但是有没有办法在增量器开始计数之前为其设置默认值?例如,我想设置一个日计数器,并且每天它都会为所有用户提前一天移动默认起点?然后我想将该点设置为增量器的起点,他们可以从该点向前和向后导航。
【解决方案2】:

如果您没有将计数器存储在某处,它将在 PageLoadPostBack 之后重置

Web page are stateless

你可以使用ViewState o SessionState

无论如何,如果您不将计数器初始化放在

If(!IsPostBack)
{
    iMainCounter = iDefualt; 
}

每次都会重置

【讨论】:

    【解决方案3】:

    通过这种方式,您的计数将始终为 2,因为您在页面加载事件中设置了它,并在页面加载事件中检查 Ispostback,因此它将始终重新初始化为等于 iDefault。 所以你应该将 iDefault 设置为不回发验证

    if(!Page.IsPostBack)
    {
       iMainCounter = iDefault;
    }
    

    另一个问题是iMainCounter没有设置为静态,所以每个事务都会重新初始化它,所以使用static int iMainCounter = 0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-16
      • 2022-01-17
      • 2018-10-28
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多