0

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

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

3 回答 3

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();
}
于 2013-05-16T19:15:50.383 回答
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

于 2013-05-16T18:35:27.263 回答
0

由于您具有整数值,因此tbPrint.Text您可以执行以下操作

设置初始tbPrint.Text1 和

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

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

于 2013-05-16T18:49:40.160 回答