簡體   English   中英

回發后,動態按鈕將不保留值

[英]Dynamic Buttons won't hold value after Post Back

我有在頁面加載時動態顯示的按鈕。 應該做的是:

  1. 單擊動態按鈕,顯示到文本框
  2. 點擊發行票
  3. 打印票1。

如果我單擊下一個動態按鈕,則應按相同的過程進行,並應打印故障單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;
    }

如果控件是動態創建的,則需要具有該控件的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();
}

當您在頁面類中聲明變量時,每次請求到達服務器時,該變量都會初始化為其值。

因此,每次您的ticket值都會初始化為0

如果要在多個請求中保留此值,則應使用ViewState並將其保留在其中。

ViewState將呈現為隱藏字段,並在每次回發時發送回服務器,您將能夠保留先前的值。

為了更好地了解保留哪些值和丟失哪些值,請查看asp.Net頁面生命周期: http : //msdn.microsoft.com/zh-cn/library/ms178472( v=vs.80 ) .aspx

而且這里的viewstate也有非常完整的描述: http : //msdn.microsoft.com/zh-cn/library/ms972976.aspx

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

由於您具有整數值作為tbPrint.Text您可以執行以下操作

設置初始tbPrint.Text 1和

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

否則,您可以使用Session,Viewstate或隱藏字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM