Sas
Sas

Reputation: 2503

Button click event doesn't work properly

This following code handle button click event. When the user click first time it sets the lable as "First Time", and when the user click second time it sets the lable as "Second Time". But it doesn't work properly. When I first click it, it sets the lable as "First time", which is correct, but when I click second time, nothing happend.

My code:

int counter=0;    
protected void btnCompTagUpdate_Click(object sender, EventArgs e)
{

    if (counter == 0)
    {
        lable1.Text="First Time";
        counter++;
    }
    else if (counter == 1)
    {
        lable1.Text="Second Time";
        counter--;
    }

    }

How can I fix it?

Upvotes: 1

Views: 2146

Answers (5)

Anas Bilal
Anas Bilal

Reputation: 1

The issue with your code is that the counter variable is not persisting its value between postbacks. Each time the button is clicked, the counter variable is reset to 0. To fix this issue, you need to persist the counter variable across postbacks, for example, by using session state. Here's how you can modify your code to achieve the desired functionality:
Code :

@{
    int counter = (Session["Counter"] == null) ? 0 : (int)Session["Counter"];
}

<!DOCTYPE html>
<html>
<head>
    <title>Button Click Counter</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <label id="label1">@ViewBag.LabelText</label>
            <br />
            <button id="btnCompTagUpdate" type="submit" runat="server" onclick="btnCompTagUpdate_Click">Click Me</button>
        </div>
    </form>

    @if (IsPostBack)
    {
        if (counter == 0)
        {
            ViewBag.LabelText = "First Time";
            counter++;
        }
        else if (counter == 1)
        {
            ViewBag.LabelText = "Second Time";
            counter--;
        }

        Session["Counter"] = counter;
    }
</body>
</html>

By using session state, the value of the counter variable will persist across postbacks, allowing your code to function correctly.

kountif.com

Upvotes: 0

sealz
sealz

Reputation: 5408

You only need to change the way you increase the counter in the method. You are not saving it back as a new variable after the button click.

int counter = 0;     
protected void btnCompTagUpdate_Click(object sender, EventArgs e) {     
if (counter == 0)     { 
counter = counter + 1;        
label1.Text="First Time";             
}    
 else if (counter == 1) {         
counter = counter - 1;        
label1.Text="Second Time";   
 }     
 } 

Upvotes: -4

Mubarek
Mubarek

Reputation: 2689

void Page_Load(object sender, EventArgs e)
 {
   if (!IsPostBack)
     Session["counter"]=0;
 }

You set the counter value at once, when first the page loads.

protected void btnCompTagUpdate_Click(object sender, EventArgs e)
{
 int counter=0;
if (Session["counter"]!=null)
 counter= Convert.ToInt32(Session["counter"]);
  if (counter == 0)
  {
    lable1.Text="First Time";
    counter++;
   Session["counter"]=counter;
  }
 else if (counter == 1)
  {
    lable1.Text="Second Time";
    counter--;
   Session["counter"]=counter;
  }

}

Upvotes: 1

Michael Liu
Michael Liu

Reputation: 55389

The values of instance fields like counter are not saved across postbacks. You need to store counter in ViewState, Session, or some other persistent store, whichever is more appropriate. For example:

private int Counter
{
    get { return ((int?)this.ViewState["Counter"]).GetValueOrDefault(); }
    set { this.ViewState["Counter"] = value; }
}

Then reference this.Counter instead of counter in btnCompTagUpdate_Click.

Upvotes: 8

Randolpho
Randolpho

Reputation: 56391

If "Coutner" is initialized exactly in the way you are listing, then that's your problem. Coutner gets re-initialized to zero after every postback. You need to save Coutner's state -- I normally recommend against it for any but the simplest cases, but I think you have a valid case for the use of ViewState.

Upvotes: 6

Related Questions