你调用的对象是空的。在动态添加checkboxlist控件时会发生这种情况

时间:2013-03-18 10:09:07

标签: asp.net

对象引用未设置为对象的实例。

protected void cmdSave_Click(object sender, EventArgs e)
{
    string strNames = string.Empty;
    CheckBoxList Chkboxx = (CheckBoxList)PlaceHolder1.FindControl("Chkbox");
    foreach (ListItem em in Chkboxx.Items)  //-------- (Showing error)
    {
        if (em.Selected)
        {
            strNames += em.Value + ", ";
        }
    }

    string final_name = strNames.Substring(0, strNames.Length - 2);
    lblNames.Text = final_name;

}

实际上我是动态添加Checkbox控件:

protected void ddl_varient_SelectedIndexChanged1(object sender, EventArgs e)
{
    string query = "select prd_vrtyvalue_id,varient_value from tbl_ProductVariety_Value  where varient='" + ddl_varient.SelectedItem.Text + "' " +
                      " order by varient_value asc ";
    DataTable abc = new DataTable();
    SqlDataAdapter ada = new SqlDataAdapter(query, new CommonClass().connection());
    ada.Fill(abc);

    ChkboxList.ID = "Chkbox";
    for (int i = 0; i < abc.Rows.Count; i++)
    {
        ChkboxList.Items.Add(new ListItem(abc.Rows[i]["varient_value"].ToString(), abc.Rows[i]["prd_vrtyvalue_id"].ToString()));
    }
    ChkboxList.RepeatColumns = 2; 
    PlaceHolder1.Controls.Add(ChkboxList);
}

任何人都可以告诉我,我到底做错了什么!

1 个答案:

答案 0 :(得分:2)

ASP.NET WebForms的工作方式是在每个回发期间重新构建整个页面。所以,我想这就是现在发生的事情:

  • 页面获得“构建”,仅包含ASCX / ASPX文件中定义的控件。
  • 用户点击DDL_VARIENT复选框,ChkboxList被添加到PlaceHolder1
  • 将表单呈现给用户,以便他们可以看到ChkboxList
  • 单击“保存”按钮,导致另一次回发。
  • 重新构建页面,将所有控件设置回ASPX / ASCX代码中定义的内容。 包含ChkboxList。
  • 您的代码被点击,ChkboxList不再存在,您就会遇到问题。

要修复,您可以在Page_Load上重新添加ChkboxList,具体取决于DDL_VARIENT复选框的值。如果我是你,我很想在你的ASPX / ASCX代码中定义ChkboxList,然后根据Page_Load中DDL_VARIENT复选框的值设置列表的可见性。

我应该补充一点,以上所有内容都取决于您使用ASP.NET WebForms。如果你正在使用MVC那么它可能是错误的。