C#:在Page_Load之后访问动态控件

时间:2016-06-18 18:43:17

标签: c# asp.net .net

我还在使用.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>

1 个答案:

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