2009-03-09 20 views
1

編集:誰も私が起こるには、以下しようとしているものを作るために、より賢明な方法を提案することができれば、また非常にデータの収集:ダイナミックテキストボックス

を理解されるだろうと私はマルチフォームを構築していますPOSTメソッドから(製品の)量をとり、その数に依存するフォームシーケンスを表示します。ユーザーが次のページに行くと、フォームはこの情報を収集して表示し(確認のため)、この情報をURLに提供するサービスに送信します。

言うまでもなく、私はこの作業に問題があります。 (素人コード)の危ない量について

public partial class foo : System.Web.UI.Page 
{ 
    Int quantityParam = 3; 
    ArrayList Users = new ArrayList(); 
    //the information for each user is held in a hashtable the array list will be an array list of the user hashtables 


protected void Page_Init(object sender, EventArgs e) 
{ 
    if(null != Request["quantity1"]) 
     { 
      this.quantityParam = Request["quantity1"]; 
     } 
} 
protected void Page_Load(object sender, EventArgs e) 
{ 
    int quantity = this.quantityParam; 
    if(quantity < 1){ mviewThankYou.SetActiveView(View4Error);} 
    else 
    { //create a form for each user 
     mviewThankYou.SetActiveView(View1EnterUsers); 
     for(int user = 0;user < quantity; user++) 
     { 
      createUserForm(user);  
     } 
    } 
} 
protected void BtnNext1_Click(object sender, EventArgs e) 
{ 
    if(Page.IsValid) 
    { 
     for(int i = 0; i < quantity; i++) 
     { 
      String ctrlName = "txtUser" + i.ToString(); 
      String ctrlEmail = "txtEmail" + i.ToString(); 
      TextBox name = (TextBox)FindControl(ctrlName); 
      TextBox email = (TextBox)FindControl(ctrlEmail); 

      /*BONUS QUESTION: How can I add the Hashtables to the Users Array without them being destroyed when I leave the function scope? 

      this is where the failure occurs: 
      System.NullReferenceException: Object reference not set to an instance of an object. on: "tempUser.Add("name",name.Text); 
      */ 

      Hashtable tempUser = new Hashtable(); 
      tempUser.Add("name",name.Text); 
      tempUser.Add("email",email.Text); 
      this.Users.Add(tempUser); 
     } 
     for(int i = 0; i < quantity; i++) 
     { 
      v2Content.Text +="<table><tr><td>Name: </td><td>"+ 
      ((Hashtable)Users[i])["name"]+ 
      "</td></tr><tr><td>Email:</td><td>"+ 
      ((Hashtable)Users[i])["email"]+ 
      "</td></tr></table>"; 
     } 
     mviewThankYou.SetActiveView(View2Confirm); 
    } 
} 
private void createUserForm(int userNum){ 
    DataTable objDT = new DataTable(); 
     int rows = 2; 
     int cols = 2; 

    //create the title row.. 
    TableRow title = new TableRow(); 
    TableCell titleCell = new TableCell(); 
    formTable.Rows.Add(title); 
    Label lblUser = new Label(); 
    lblUser.Text = "<b>User "+ (userNum+1) + "</b>"; 
    lblUser.ID = "lblTitle"+ userNum; 
    titleCell.Controls.Add(lblUser); 
    title.Cells.Add(titleCell); 

    for(int i = 0; i < rows; i++) 
    { 
     TableRow tRow = new TableRow();  
     formTable.Rows.Add(tRow); 
     for(int j = 0; j < cols; j++) 
     { 
      TableCell tCell = new TableCell(); 
      if(j == 0){ 
       Label lblTitle = new Label(); 
       if(i == 0){ 
        lblTitle.Text = "User Name:"; 
        lblTitle.ID = "lblUser" + userNum; 
       } 
       else{ 
        lblTitle.Text = "User Email:"; 
        lblTitle.ID = "lblEmail" + userNum; 
       } 
       tCell.Controls.Add(lblTitle); 
      } else { 
       TextBox txt = new TextBox(); 
       if(i==0){ 
        txt.ID = "txtUser" + userNum; 
       } 
       else{ 
        txt.ID = "txtEmail" + userNum; 
       } 
       RequiredFieldValidator val = new RequiredFieldValidator(); 
       val.ID = txt.ID + "Validator"; 
       val.ControlToValidate = txt.UniqueID; 
       val.ErrorMessage = "(required)"; 

       tCell.Controls.Add(txt); 
       tCell.Controls.Add(val); 
      } 
      tRow.Cells.Add(tCell); 
     }//for(j) 
    }//for(i) 

    //create a blank row... 
    TableRow blank = new TableRow(); 
    TableCell blankCell = new TableCell(); 
    formTable.Rows.Add(blank); 
    Label blankLabel = new Label(); 
    blankLabel.Text = " "; 
    blankLabel.ID = "blank" + userNum; 
    blankCell.Controls.Add(blankLabel); 
    blank.Cells.Add(blankCell);   

}//CreateUserForm(int) 

申し訳ありません:ここに私の(匿名)コードの関連部分です。私が失敗した場合、FindControl()は機能していないと思われますが、理由はわかりません...

助けがあれば、私は非常に素晴らしいでしょう。

編集:エラーを示すには役立つかもしれない:

エラー(ライン112) 例外の詳細:System.NullReferenceException:オブジェクト参照オブジェクトのインスタンスに設定されていませんが。

ソースエラー:

ライン111:HashtableのtempUser =新しいHashtableの();
行112:tempUser.Add( "name"、name.Text);
行113:tempUser.Add( "email"、email.Text);
行114:this.Users.Add(tempUser);

+0

「何失敗はにFindControl()が動作していないということであれば、私は疑うが、私は、なぜ...把握することはできません」、デバッガ上でそれを実行してください、あなたが言うことができるようになりますあなたはまだ – eglasius

+0

を見つけたり、両方のファイルを投稿しないと戻ってくることができますか? – BenB

+0

にFindControl()が起動し、コードから特異的)createUserForm(で作成したコントロールを探しています: ... ラベルlblTitle =新しいラベル(); および終了 tCell.Controls.Add(txt) ...(コメントが長すぎる) 私は他のファイルを投稿する必要がありますか? (私はFindControl()も失敗していると思いますが、理由を見ることができません...) – matthewdunnam

答えて

0

私はそれを考え出した:

にFindControl()は、それが上と呼ばれるコントロールの子の直接探索として動作します。

私はそれを呼んでいたとき、それは私がtableID.FindControl(呼び出されたときに、私は

をフィールド内のテーブルの作成を入れ子にして表コントロールしていた(自動的に)Page.FindControl()だったが)それだけでコントロールを見つけましたそれはすべきだ。

助けてくれてありがとう、グレゴリー、そしてすべてのコメントの皆さん。

-Mattが

0

問題は、毎回Page_Loadでフォームをリロードしているという事実にあります。ダイナミックテキストボックスを一度ロードするだけで、確認のために必要なときに見つけることができます。 Page_Loadが再構築される限り、あなたは答えを見つけることができず、何も見つけられない危険があります。

+0

これは良い点ですが、私は変更を加えましたが、問題を修正しませんでした。 – matthewdunnam

関連する問題