2011-01-11 7 views
0

に動的に追加したコントロールの選択された値を見つけることができません。これらのコントロールは、Controls.Addを使用してItemDataBoundイベントでRepeaterに動的に追加されます。は、私がradiobuttonlists、checkboxlistsまたはテキストボックスすることができ質問と回答のリストを持っているアンケートのページを作成していリピータ

私はページを正常に表示することができましたが、フォームを送信し、ラジオボタンとテキストボックス値の選択された値を取得するためにリピータのコントロールを反復処理すると、FindControlはnullを返します。選択した値を取得するには何が必要ですか?私はRepeaterItemsを反復しようとしましたが、それもnullを返しました。私はさまざまなタイプのFindControlを試しましたが、コントロールタイプを決して解決しません。私はしかし、この

<asp:Repeater ID="rptSurvey" runat="server" Visible="true" EnableViewState="true" > 
<ItemTemplate> 
     <%# DataBinder.Eval(Container.DataItem, "Question") %> 
</ItemTemplate> 
</asp:Repeater> 

のようにリピーターに宣言型のDataBinderを追加する場合 それは私が動的にコントロールを追加する必要はなく、これを行うには、私が提出selectedvaluesを得るカント、動作します。これは私のコードの主な構造です。

<html> 
<asp:Repeater ID="rptSurvey" runat="server" Visible="true">      
</asp:Repeater> 
<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" /> 
</html> 

protected void Page_Load(object sender, EventArgs e) 
{ 

    ... 

      if (!IsPostBack) 
      { 
       rptSurvey.DataSource = GetQuestions(); 
       rptSurvey.DataBind(); 
      } 
    ... 

} 

protected void rptSurvey_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
      { 
       string question = (DataBinder.Eval(e.Item.DataItem, "Question")).ToString(); 

       litQuestion = new Literal(); 
       litQuestion.Text = question; 
     RadioButtonList rblAnswer = (RadioButtonList)item; 


        rptSurvey.Controls.Add(rblAnswer); 
    } 
} 

protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
      ... 
      Dictionary<int, string> answers = new Dictionary<int, string>(); 

      try 
      { 
       var list = FindControls(rptSurvey, c => c is RadioButtonList || c is CheckBoxList || c is TextBox); 

       foreach (Control item in list) 
       { 
        QuestionId = int.Parse(Questions.Rows[list.IndexOf(item)][0].ToString()); 

        if (item is TextBox) 
        { 
         TextBox txtAnswer = (TextBox)item; 
         answers.Add(QuestionId, txtAnswer.Text); 
        } 
        else if (item is RadioButtonList) 
        { 
         RadioButtonList rblAnswer = (RadioButtonList)item; 
         answers.Add(QuestionId, rblAnswer.SelectedItem.Text); 
        } 

        else if (item is CheckBoxList) 
        { 
         // Iterate through the Items collection of the CheckBoxList 
         string cblMultiAnswer = ""; 
         for (int i = 0; i < cblAnswer.Items.Count; i++) 
         { 
          if (cblAnswer.Items[i].Selected) 
          { 
           cblMultiAnswer += cblAnswer.Items[i].Value + ","; 
          } 
         } 

         answers.Add(QuestionId, cblMultiAnswer); 
        } 
       } 

       bSurvey.BLInsertSurveyAnswers(answers, dateCreated, _userEmail); 
      } 
     } 

     public static List<Control> FindControls(Control parent, Predicate<Control> match) 
     { 
      var list = new List<Control>(); 
      foreach (Control ctl in parent.Controls) 
      { 
       if (match(ctl)) 
        list.Add(ctl); 
       list.AddRange(FindControls(ctl, match)); 
      } 
      return list; 
} 

答えて

1

最初に(非ポストバックではなく)コントロールツリーを作成する必要があります。それはoninitまたはonpreloadイベントで行います。

はここを見て:http://www.4guysfromrolla.com/articles/081402-1.aspx

+0

おかげkarlis、ページとそのコントロールがOKレンダリング。そのとき、私はコントロールを列挙してnullになるという値を取得しようとします。私はコントロールを追加することで、OnItemDataBoundはコントロールツリーを作成することになり、コントロールツリーが表示されている限り、そこにあると考えました。他に何か根本的なものがないのですか? – Brendan

+0

あなたはコントロールツリーを常に構築するようにコードを変更しましたか? - >私は、thatsのはOK、あなたがリピーターに追加されているとは思わないが、あなたrptSurvey.Controls.Add(rblAnswer):多分あなたはinitalポストにあなたのコードを更新.... – karlis

+0

は、私はあなたのソースコードをもう一度見て持っていましたアイテムに追加する必要があり、 - > e.Item.Controls.Add(rblAnswer) – karlis

関連する問題

 関連する問題