0

我是编程新手,遇到了问题。我在 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);
            }

 }     

单击“获取数据”按钮时,会生成多个带有相关文本的复选框。

我单击一些复选框,然后单击显示按钮,如果工作正确,该按钮应将选定的复选框文本组合成单个字符串并显示它。

显示

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 的信息,但是当涉及大量数据时不建议这样做,因为会导致显着的处理延迟。

另一种方法是使用Session。这里有没有使用IsPostBack页面属性?

请指导如何实现 Session 以将选定的复选框从一个按钮(GetData)单击传递到其他即显示按钮。

4

1 回答 1

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 损坏/无效的风险。

于 2012-12-10T14:28:19.750 回答