0

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

单击时有一个按钮,会将选定的复选框值添加到数据库中,但现在当单击该按钮并在回发后,页面将显示错误“System.NullReferenceException”。

以下代码写在 Page_Load 中 (!Page.IsNotPostBack) 并在一个循环中动态创建多个复选框列表:

                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     
}

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

4

2 回答 2

2

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

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

这是我经常遇到这类问题的页面:http: //msdn.microsoft.com/en-us/library/ms178472.aspx

于 2010-03-26T17:33:37.210 回答
1

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

您可以通过重写来最轻松地做到这一点,CreateChildControls() 这将在适当的时间创建控件,在页面生命周期的后期,它们的 ViewState 将被填充,它们将拾取存储在那里的任何设置。

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

于 2010-03-24T01:25:40.723 回答