简体   繁体   中英

Dynamic Buttons won't hold value after Post Back

I have buttons that display dynamically when the page loads. What is suppose to do is:

  1. Click a dynamic button, displays to a text box
  2. Click Issue Ticket
  3. Print Ticket 1.

If I click on the next dynamic button it should go thru the same process and it should print Ticket 2.

The issue is that is not incrementing in value. I believe is because the page postback everytime I click the Issue Ticket therefore resetting the ticket value back to 1. Anyway to go around this.

int ticket = 0;    

protected void Page_Load(object sender, EventArgs e)
{
      string buttonName;
      try
      {

         btnIssueTicket.Enabled = false;
         using (SqlConnection connStr = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectString"].ConnectionString))
           {
                connStr.Open();
                SqlCommand select = new SqlCommand("SELECT TransTypeId, TransTypeDesc from tblTransType", connStr);
                SqlDataReader reader = select.ExecuteReader();

                //Reads all records 
                while (reader.Read())
                {
                    transID = Convert.ToInt32(reader["TransTypeId"].ToString());
                    buttonName = reader["TransTypeDesc"].ToString();

                    CreateButton(buttonName);
                }

                connStr.Close();
                reader.Close();

            }
        }
        catch (Exception ex)
        {
            lblStatus.Text = "Error: " + ex.Message.ToString();
        }

    } 
}

 //Buttons properties. Creates buttons dynamically inside the Layout Panel
    private void CreateButton(string buttonName)
    {


        transbutton = new Button();

        transbutton.Text = buttonName;
        transbutton.ID = transID.ToString();
        transbutton.CssClass = "transButtons";  //CSS property for buttons        
        transbutton.Click += new EventHandler(transbutton_Click); //Event Handler for dynamic buttons
        panelButtons.Controls.Add(transbutton); //Adds button to Layout Panel

    }

    //When Dynamic buttons clicked.
    private void transbutton_Click(object sender, EventArgs e)
    {  
        //Displays Transactions in TextBox
        tbList.Text += ((Button)sender).Text + "\r\n";
        btnIssueTicket.Enabled = true;
        lblStatus.Text = "";                   
    }

   protected void btnIssueTicket_Click(object sender, EventArgs e)
    {

         tbPrint.Text = ticket + 1;
    }

You need to have ID for a control if it is created dynamically.

Otherwise, they will become null when the page is posted back to server.

rotected void Page_Load(object sender, EventArgs e)
{
   string buttonName;
   try
   {   
      ...
      CreateButton(transID, buttonName); // Pass transID          
      ...
   } 
}

private void CreateButton(int transID, string buttonName)
{
  transbutton = new Button();
  transbutton.Text = buttonName;
  transbutton.ID = transID.ToString(); // ID is required
  ...
}

Besides, if you want to keep track the number of tickets, you need to save it in ViewState to persist the data.

public int Ticket
{
    get { return Convert.ToInt32(ViewState["Ticket"] ?? 0); }
    set { ViewState["Ticket"] = value; }
}

// Usage
protected void btnIssueTicket_Click(object sender, EventArgs e)
{
     Ticket++;
     tbPrint.Text = Ticket.ToString();
}

When you declare a variable inside your page class, it is initialized to its value every time a request hits the server.

So each time, your ticket value is initialized to 0 .

If you want to keep this value over multiple requests, you should use the ViewState and keep that value in it.

The ViewState will be rendered as a hidden field and sent back to the server at every postback, and you'll be able to keep the precedent value.

To have a better understanding of which values are kept and which are lost, take a look at the asp.Net page lifecycle: http://msdn.microsoft.com/en-us/library/ms178472(v=vs.80).aspx

and also there is a very complete description of the viewstate here: http://msdn.microsoft.com/en-us/library/ms972976.aspx

and also here: http://www.codeproject.com/Articles/31344/Beginner-s-Guide-To-View-State

Since you having integer value as tbPrint.Text You can do as below

Set initial tbPrint.Text 1 and

int no;
if (int.TryParse(tbPrint.Text, out no))
{
    tbPrint.Text = no + 1;
}

Otherwise You can use Session, Viewstate, or a hidden field.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM