0

データベースの行数に基づいて、データで満たされた多数のチェックボックスリストを動的に作成する Web フォームがあります。次に、これがプレースホルダーに追加されて表示されます。

クリックするとボタンがあり、選択したチェックボックスの値がデータベースに追加されますが、現在ボタンをクリックするとポストバック後に、ページに「System.NullReferenceException」というエラーが表示されます。

次のコードは、(!Page.IsNotPostBack) 内の Page_Load と、多数のチェックボックス リストを動的に作成するループ内に記述されています。

                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     
}

ポストバック後にコントロールが再作成されないように見えるため、誰でも助けることができるため、コントロールが見つからず、null 参照例外がスローされます。

4

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