C# C:加载页面后访问动态控件

C# C:加载页面后访问动态控件,c#,asp.net,.net,C#,Asp.net,.net,我还是一个新的.NET工作人员,我仍然对它的生命周期有点困惑,我认为我需要与它合作来解决这个问题 我将添加代码的简化版本,其中我必须使用列表中包含的字符串创建许多复选框。一旦它们被创建,我应该能够选择其中一些,单击另一个按钮,并获得所选复选框的数量 由于重新加载页面,动态内容的控制值被删除,因此无法工作。我试着用这样的方法: ViewState.Add("panelCheckListContainer", CheckListContainer); 但我只能从中得到错误。我见过一些类似的问题,但

我还是一个新的.NET工作人员,我仍然对它的生命周期有点困惑,我认为我需要与它合作来解决这个问题

我将添加代码的简化版本,其中我必须使用列表中包含的字符串创建许多复选框。一旦它们被创建,我应该能够选择其中一些,单击另一个按钮,并获得所选复选框的数量

由于重新加载页面,动态内容的控制值被删除,因此无法工作。我试着用这样的方法:

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>");
    }