在占位符控件中动态创建“CheckBoxList”,在页面回发期间抛出空引用异常错误

时间:2010-03-24 01:23:56

标签: c# postback nullreferenceexception checkboxlist

我有一个Web表单,它将根据数据库中的行数动态创建一些填充数据的checkboxlist。然后将其添加到要显示的占位符中。

单击一个按钮,将所选的复选框值添加到数据库中,但是当单击该按钮时,此时页面将显示错误“System.NullReferenceException”。

以下代码用Page_Load编写(!Page.IsNotPostBack),并在一个循环中动态创建一些checkboxlist:

                CheckBoxLis chkContent = new CheckBoxList();
                chkContent.ID = chkIDString; //chkIDString is an incremental int based on the row count 
                chkContent.RepeatDirection = RepeatDirection.Horizontal;                    
                foreach (List<t> contentList in List<t>) //data retrieved as List<t> using LINQ
                {
                    ListItem contents = new ListItem();
                    contents.Text = contentList.Title;
                    contents.Value = contentList.contentID.ToString();
                    chkContent.Items.Add(contents);
                }

                plcSchool.Controls.Add(chkContent); //plcSchool is my placeholder
                plcSchool.Controls.Add(new LiteralControl("<br>"));



protected void btnAdd_Click(object sender, EventArgs e)
{
    CheckBoxList cbl = Page.FindControl("chkContent4") as CheckBoxList;
    Response.Write(cbl.SelectedValue.ToString()); // now im just testing to get the value from one of the checkboxlist     
}

任何人都可以提供帮助,因为似乎控件不会在回发后重新创建,因此它无法找到控件并抛出空引用异常。

2 个答案:

答案 0 :(得分:2)

编辑:这实际上是两个问题 - 控件不存在,并且它们的值不会填充。在Page.IsPostback检查之外移动控件创建将创建它们,但所选的值不会在页面生命周期的后期自动重新填充。

所以问题是当页面进入视图状态时你的控件不存在 - 解决这个问题的一种便宜方法是在page_init中创建动态控件。

这是我经常使用这些类型的问题访问的页面:http://msdn.microsoft.com/en-us/library/ms178472.aspx

答案 1 :(得分:1)

简短的回答是每次回发都必须创建动态创建的控件,否则它们将不会出现。您需要每次都创建控件。

您可以通过覆盖CreateChildControls()来最轻松地执行此操作。这将在适当的时间创建控件,稍后在页面生命周期中,将填充其ViewState并且它们将拾取存储在其中的任何设置。 / p>

在您的情况下,只需将控件创建移到!Page.IsPostback块之外。