2012-05-03 6 views
1

条件に基づいてページに動的にコントロールを追加しています。これらのコントロールにはイベントハンドラも添付されたボタンがありますこのイベントハンドラでは、私は動的に生成されたコントロールにアクセスしようとしていますが、例外が発生しています。動的に生成されたコントロールにアクセスするオブジェクト参照がオブジェクトのインスタンスに設定されていない

protected void Page_Load(object sender, EventArgs e) 
     { 
      String Method = Request.QueryString["Method"]; 
      String Tag = Request.QueryString["Tag"]; 


      if (Method=="ADD" && Tag=="METHOD") 
      { 

       //6 
      TableCell cell11 = new TableCell(); 
      cell11.Text = "NEXTLEVEL"; 

      TableCell cell12 = new TableCell(); 
      TextBox txt6 = new TextBox(); 
      txt6.ID = "txt6"; 
      cell12.Controls.Add(txt6); 

      TableRow row6 = new TableRow(); 
      row6.Cells.Add(cell11); 
      row6.Cells.Add(cell12); 

      container.Rows.Add(row6); 
       TableCell cell14 = new TableCell(); 
       Button submit = new Button(); 
       submit.ID = "SubmitButton"; 
       submit.Text = "Submit"; 
       submit.Click += new EventHandler(submit_Click); 

       cell14.Controls.Add(submit); 

       TableRow row7 = new TableRow(); 

       row7.Cells.Add(cell14); 

       container.Rows.Add(row7); 
      } 

void submit_Click(object sender, EventArgs e) 
     { 
      ModifySessionAnalyzer msa = new ModifySessionAnalyzer(); 
      TextBox txt6= (TextBox)Page.FindControl("txt6") as TextBox; 
      ##String message = txt6.Text;## 

     } 
+1

...代わりに新しいテキストボックスを追加している、セルにtxt6コントロールを追加していませんか?このIDを持つテキストボックスはどこに宣言されていますか? –

+0

私のコードを更新しました。 submit_clickイベントハンドラでtxt6にアクセスできました。 – Charu

答えて

2
TableCell cell12 = new TableCell(); 
TextBox txt6 = new TextBox(); 
txt6.ID = "txt6"; 
cell12.Controls.Add(new TextBox()); 

を行っているものを探して、あなたはあなたが `txt6`にアクセスすることはできません

+0

さて、これを理解してコードを修正しました。私は現在、ダイナミックコントロールにアクセスできます。私はCrabBucketによって与えられたここでのステ​​ートメントで、Page_Initではなく、Page_Initで動的に生成されたコードを書くと思っています。なぜ私はこれを行う必要がありますか? – Charu

+1

PageLoadでコントロールを作成すると、PostBackが発生したときにユーザーが定義した値が失われるためです。良い方法は、PageInitにコントロールを作成し、必要な値をPageLoadにロードすることです。ポストバックがあると、PageInitでコントロールが再作成され、.NETによってViewStateデータがコントロールに読み込まれます。私はこれがもう.NET 4の問題ではないと思う。あなたは私の答えを受け入れますか? :) – Dante

+0

@ダンテ。 PageInit/PageLoadダイナミックコントロールの作成に関する問題のリンク/参照が.Net 4.で問題ではないことがありますか。ちょうど興味があります。おかげで –

1

動的に追加したコントロールがPage_Init方法はないPage_Loadに追加する必要があります。ここに私のコードです。 Page_Loadに追加された場合、コントロールツリーに追加されず、問題が発生します。つまり、ViewStateに正しく参加しません。テキストボックスは、もは​​やコントロールツリー

である。これは、あなたの問題の源となる可能性があるので

ので(TextBox)Page.FindControl("txt6")は失敗することができませんでした。

さらなる説明

あなたのコードは

protected void Page_Init(object sender, EventArgs e) 
{ 
     //.. your code goes here 
} 

ませ

protected void Page_Load(object sender, EventArgs e) 
{ 
    //.. your code 
} 

でなければなりませんそれはPage_Loadを使用するために、通常の練習ですので、それは人々のためだけの簡単な習慣ですが、使用している場合ダイナミックコントロールの場合は例外です

ダイナミックコントロールとは、ページ内でコントロールを宣言するのではなく、オンザフライでコントロールを追加したときのことです。これは間違っているあなたがControls.Add

+0

私は動的に生成されたコントロールにアクセスできるコードを更新しました。私はpage_initにそれらを追加するあなたのポイントを得ていませんでしたか?あなたはもっと光を投げることができますか? – Charu

関連する問題