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 に答える