我是编程新手并遇到问题。我在aspx页面上有两个按钮。
这两个按钮都具有runat="server"
属性,位于<form runat="server" >
标记
aspx代码
<form id="form1" runat="server">
<asp:Button ID="btnGetData" runat="server" onclick="btnGetData_Click" />
<asp:Button ID="btnShow" Text="Send" runat="server" onclick="btnShow_Click" />
</form>
btnGetData
protected void btnGetData_Click(object sender, EventArgs e)
{
headlines = masg.Split('*');
//Response.Write(headlines.Length);
cb = new CheckBox[headlines.Length];
for (int i = 0; i < headlines.Length; i++)
{
cb[i] = new CheckBox();
cb[i].Text = headlines[i];
Literal br = new Literal();
br.Text = "<br/>";
Form.Controls.Add(cb[i]);
Form.Controls.Add(br);
}
}
单击“获取数据”按钮,将生成多个带有关联文本的复选框。
我点击了一些复选框,然后点击显示按钮如果工作正确应将选定的checboxes文本组合成单个字符串并显示它。
btnShow
protected void btnShow_Click(object sender, EventArgs e)
{
for (int i = 0; i < headlines.Length; i++)
{
if (cb[i].Checked)
newmsg += cb[i].Text + '*';
}
Response.Write("<BR><BR><BR>" + newmsg);
}
但是一旦我点击GetData按钮,复选框就会丢失,因为它们不会持久存在,因为HTTP是无规则的。我读到了有关Viewstate的信息,但是当涉及大量数据时不建议这样做会导致显着的处理延迟。
替代方法是使用会话。这里有IsPostBack
页面属性吗?
请指导如何实施Session以从一个按钮(GetData)点击其他即显示按钮传递所选复选框。
答案 0 :(得分:1)
您遇到的是一个相当常见的问题,因此我建议您使用转发器。例如:
<asp:Repeater id="rptCheckboxes" runat="server">
<ItemTemplate>
<asp:CheckBox ID="cbxMessage" runat="server" Text="<%# Container.DataItem %>" />
<br />
</ItemTemplate>
</asp:Repeater>
在代码中:
protected void btnGetData_Click(object sender, EventArgs e)
{
headlines = masg.Split('*');
rptCheckboxes.DataSource = headlines;
rptCheckboxes.DataBind();
}
protected void btnShow_Click(object sender, EventArgs e)
{
string newmsg = new string();
foreach(RepeaterItem currentControl in rptCheckboxes.Items)
{
CheckBox currentCheckBox = currentControl.FindControl("cbxMessage");
if(currentCheckBox != null && currentCheckBox.Checked)
{
newmsg += cb[i].Text + '*';
}
}
//This is a bad idea here, but we'll keep it for now
Response.Write("<BR><BR><BR>" + newmsg);
}
请注意,这是概念证明,并未经过测试才能正常运行。这里的基础是在回发期间,所有控件都会根据aspx页面以及您为该帖子编写的任何逻辑重置。您永远不应该在回发中动态添加控件,并且应该只使用占位符来实现,以便最大程度地降低ViewState损坏/无效的风险。