0

你调用的对象是空的。

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;

}

实际上我正在动态添加复选框控件:

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

谁能告诉我,我到底做错了什么!

4

1 回答 1

2

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

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

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

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

于 2013-03-18T10:24:10.807 回答