2013-05-16 39 views
0

我有加載頁面時動態顯示的按鈕。 什麼是該做的是:動態按鈕在回發後不會保留價值

  1. 點擊一個動態按鈕,將顯示一個文本框
  2. 單擊頒發票務
  3. 打印准考證1.

如果我點擊下動態按鈕它應該通過相同的過程,它應該打印票2。

問題是,這不是增值的價值。我相信是因爲頁面回發每次點擊Issue Ticket,因此將票據值重新設置爲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; 
    } 
+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

1

如果控件是動態創建的,則需要有控件的ID。

否則,當頁面回發給服務器時,它們將變爲空。

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

我是這個ViewState的新手,我該如何使用public int Ticket? – Apollo

+0

Web應用程序是無狀態的;本地變量不會在回發之間持續。答案是 - ***不,如果你想保存數據,你不能使用局部變量。*** – Win

+0

我知道你不能使用局部變量。問題是如何在視圖狀態下使用它。 – Apollo

0

當您在頁面類中聲明一個變量時,每次請求到達服務器時都會將其初始化爲它的值。

因此,每次您的ticket值初始化爲0

如果您希望將此值保留在多個請求上,則應使用ViewState並將其保留。

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

爲了有更好的理解它的值保持和丟失,看看在asp.Net頁面生命週期: http://msdn.microsoft.com/en-us/library/ms178472(v=vs.80).aspx

,也有視圖狀態的一個非常完整的描述在這裏: http://msdn.microsoft.com/en-us/library/ms972976.aspx

,並在這裏: http://www.codeproject.com/Articles/31344/Beginner-s-Guide-To-View-State

+0

我從來沒有使用過viewstate。我如何在這裏使用? – Apollo

0

既然你有整數值tbPrint.Text你可以做如下

設置初始tbPrint.Text 1和

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

否則,您可以使用會話,視圖狀態,或隱藏字段。