回发后,动态按钮不会保持值

时间:2013-05-16 18:30:10

标签: c# asp.net visual-studio-2010 postback

我有按钮在页面加载时动态显示。 假设要做的是:

  1. 点击动态按钮,显示到文本框
  2. 点击发行票据
  3. 打印票1。
  4. 如果我点击下一个动态按钮,它应该通过相同的过程,它应该打印Ticket 2.

    问题在于价值没有增加。我相信是因为每次点击发票时页面都会回发,因此将票证值重置为1.无论如何要绕过这个。

    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;
        }
    

3 个答案:

答案 0 :(得分:1)

如果控件是动态创建的,则需要具有ID。

否则,当页面回发到服务器时,它们将变为null。

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
  ...
}

此外,如果您想跟踪门票数量,则需要将其保存在ViewState以保留数据。

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();
}

答案 1 :(得分:0)

在页面类中声明变量时,每次请求到达服务器时,它都会初始化为其值。

因此,每次将ticket值初始化为0

如果您希望将此值保留在多个请求中,则应使用ViewState并将该值保留在其中。

ViewState将呈现为隐藏字段,并在每次回发时发送回服务器,您将能够保留先前值。

要更好地了解保留哪些值以及丢失哪些值,请查看asp.Net页面生命周期: http://msdn.microsoft.com/en-us/library/ms178472(v=vs.80).aspx

此处还有一个非常完整的viewstate描述: http://msdn.microsoft.com/en-us/library/ms972976.aspx

也在这里: http://www.codeproject.com/Articles/31344/Beginner-s-Guide-To-View-State

答案 2 :(得分:0)

由于整数值为tbPrint.Text,您可以执行以下操作

设置初始tbPrint.Text 1和

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

否则您可以使用Session,Viewstate或隐藏字段。