动态按钮在Post Back后不再保持价值
本文关键字:不再 按钮 Post Back 动态 | 更新日期: 2023-09-27 18:14:03
我有一些按钮在页面加载时动态显示。应该做的是:
- 点击动态按钮,显示到文本框
- 打印票据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;
}
如果控件是动态创建的,则需要有控件的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();
}
当您在页面类中声明变量时,每次请求到达服务器时,它都会初始化为它的值。
所以每次,你的ticket
值初始化为0
。
如果您希望在多个请求中保持此值,则应该使用ViewState
并在其中保持该值。
ViewState
将呈现为一个隐藏字段,并在每次回发时发送回服务器,并且您将能够保留先例值。
为了更好地理解哪些值被保留,哪些值被丢失,请查看asp。网页生命周期: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
既然你有整数值作为tbPrint.Text
,你可以做如下
设置初始tbPrint.Text
1和
int no;
if (int.TryParse(tbPrint.Text, out no))
{
tbPrint.Text = no + 1;
}