我还在使用.NET,我仍然对使用它的生命周期感到困惑,我认为我需要与之合作解决这个问题。
我将添加代码的简化版本,我必须使用List中包含的字符串创建许多复选框。一旦他们创建了我应该能够选择其中一些,点击另一个按钮,并获得所选复选框的数量。
由于页面重新加载,动态内容的控制值将被删除,因此无法正常工作。我试过用这样的东西:
ViewState.Add("panelCheckListContainer", CheckListContainer);
但我只是从中得到错误。我已经看到了一些类似的问题,但是他们的解决方案对我没有用,或者我还没有能够让它们发挥作用。
代码如下:
Panel panelCheckListContainer = new Panel();
protected void buttonCheck_Click(object sender, EventArgs e)
{
List<string> results = Get_Rand_Values();
Get_CheckList(results);
}
private void Get_CheckList(List<string> results)
{
CheckBox checkBox;
panelCheckListContainer.ID = "correction-check-list";
panelCheckListContainer.CssClass = "checkbox";
foreach (string result in results)
{
checkBox = new CheckBox();
checkBox.ID = Cypher_MD5(result);
checkBox.Text = result;
//checkBox.CheckedChanged += new EventHandler(Change);
panelCheckListContainer.Controls.Add(checkBox);
}
checkList.Controls.Add(panelCheckListContainer);
}
protected void buttonCount_Click(object sender, EventArgs e)
{
int i = 0;
foreach (Control c in panelCheckListContainer.Controls)
{
if ((c is CheckBox) && ((CheckBox)c).Checked)
{
++i;
}
}
Response.Write("<script>alert('Checked: " + i + "');</script>");
}
这是附加复选框的占位符:
<asp:PlaceHolder runat="server" ID="checkList"></asp:PlaceHolder>
答案 0 :(得分:0)
正如我们所知,HTTP是一种无状态协议,ASP.NET会针对每个请求执行整个页面生命周期。由于它使用初始控件初始化新的页面对象。由于动态控件在类定义中不存在,并且它们在运行时实例化,因此所有动态控件都从渲染中删除。如果有人想在下次页面渲染时渲染并加载这些动态控件,那么他应该在page_load事件中处理(动态控件初始化)代码。
现在您想要保留动态控件的值,然后您可以使用“请求”对象或“隐藏字段”。我在您的代码段中添加了一些代码,试试这个。
protected void Button1_Click(object sender, EventArgs e)
{
List<string> results = Get_Rand_Values();
Get_CheckList(results);
Session["results"] = results;
}
protected void buttonCount_Click(object sender, EventArgs e)
{
int i = 0;
//foreach (Control c in )
//{
// if ((c is CheckBox) && ((CheckBox)c).Checked)
// {
// ++i;
// }
//}
var results = (List<string>)Session["results"];
foreach (var k in results)
{
var tmp = Request[Cypher_MD5(k)];
if(tmp == "on")
{
i++;
}
count++;
}
Response.Write("<script>alert('Checked: " + i + "');</script>");
}