C# C:加载页面后访问动态控件
我还是一个新的.NET工作人员,我仍然对它的生命周期有点困惑,我认为我需要与它合作来解决这个问题 我将添加代码的简化版本,其中我必须使用列表中包含的字符串创建许多复选框。一旦它们被创建,我应该能够选择其中一些,单击另一个按钮,并获得所选复选框的数量 由于重新加载页面,动态内容的控制值被删除,因此无法工作。我试着用这样的方法:C# C:加载页面后访问动态控件,c#,asp.net,.net,C#,Asp.net,.net,我还是一个新的.NET工作人员,我仍然对它的生命周期有点困惑,我认为我需要与它合作来解决这个问题 我将添加代码的简化版本,其中我必须使用列表中包含的字符串创建许多复选框。一旦它们被创建,我应该能够选择其中一些,单击另一个按钮,并获得所选复选框的数量 由于重新加载页面,动态内容的控制值被删除,因此无法工作。我试着用这样的方法: ViewState.Add("panelCheckListContainer", CheckListContainer); 但我只能从中得到错误。我见过一些类似的问题,但
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>
正如我们所知,HTTP是一种无状态协议,ASP.NET会在每个请求的整个页面生命周期中运行。因此,它使用初始控件初始化一个新的页面对象。由于类定义中不存在动态控件,并且它们在运行时实例化,因此所有动态控件都将从呈现中移除。如果有人希望下次在页面呈现时呈现和加载这些动态控件,那么他应该在页面加载事件中处理动态控件初始化代码 现在,您希望保留动态控件的值,然后可以使用请求对象或隐藏字段。我已经在您的代码段中添加了一些代码,请尝试以下操作
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>");
}
正如我们所知,HTTP是一种无状态协议,ASP.NET会在每个请求的整个页面生命周期中运行。因此,它使用初始控件初始化一个新的页面对象。由于类定义中不存在动态控件,并且它们在运行时实例化,因此所有动态控件都将从呈现中移除。如果有人希望下次在页面呈现时呈现和加载这些动态控件,那么他应该在页面加载事件中处理动态控件初始化代码 现在,您希望保留动态控件的值,然后可以使用请求对象或隐藏字段。我已经在您的代码段中添加了一些代码,请尝试以下操作
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>");
}