2012-02-12 13 views
0

小さなクイズを作成するために、ASP.NET WebフォームにラベルとRadioButtonListを含むリピータを設定しようとしています。ASP.NETリピータテンプレート内にRadioButtonListを設定できません

public class Option 
{ 
    private string _body; 
    private bool? _isCorrect; 

    #region properties 
    public string Body 
    { 
     get { return _body; } 
    } 

    public bool? IsCorrect 
    { 
     get { return _isCorrect; } 
    } 

    #endregion 

    #region constructors 

    public Option(string body) 
    { 
     _body = body; 
     _isCorrect = null; 
    } 

    public Option(string body, bool isCorrect) 
    { 
     _body = body; 
     _isCorrect = isCorrect; 
    } 
    #endregion 

    #region methods 

    public override string ToString() 
    { 
     return _body; 
    } 

    #endregion 

} 

と::

<div runat="server" ID="quizDiv"> 



    <br /> 
    <br /> 

    <asp:Repeater ID="Repeater1" runat="server"> 
     <ItemTemplate> 
      <%--<asp:Label ID="questionBody" runat="server" Text=<%# DataBinder.Eval(Container.DataItem, "Body") %>>--%> 
      <asp:Label ID="questionBody" runat="server" Text=<%# ((Question)Container.DataItem).Body %>> 
      <asp:radiobuttonlist ID="blah" runat="server" DataTextField="Body" DataValueField="Body" DataSource=<%# ((Question)Container.DataItem).OptionsList %> > 

      </asp:radiobuttonlist> 
      </asp:Label> 
     </ItemTemplate> 
    </asp:Repeater> 
    <br /> 


</div> 

とコードビハインドそうのような:

public class Question 
{ 
    private string _body; 
    private Option[] _optionsArray; 
    private List<Option> _optionsList; 

    #region properties 

    public string Body 
    { 
     get { return _body; } 
    } 

    public Option[] Options 
    { 
     get { return _optionsArray; } 
    } 

    public List<Option> OptionsList 
    { 
     get { return _optionsList; } 

    } 
    #endregion 


    #region constructors 

    public Question(string body, Option[] options) 
    { 
     _body = body; 

     _optionsArray = options; 

     _optionsList = new List<Option>(); 
     foreach (Option opt in options) 
     { 
      _optionsList.Add(opt); 
     } 
    } 

    #endregion 

    #region methods 

    public override string ToString() 
    { 
     return _body; 
    } 

    public List<Option> GetOptions() 
    { 
     return OptionsList; 
    } 

    #endregion 

} 

を私のWebフォームは、次のようになります

これらは私が使用していたクラスです

protected void btnStart_Click(object sender, EventArgs e) 
    { 
     Dataset1 ds = new Dataset1(); 
     question = ds.CreateQuestion(); 

     List<Question> qts = new List<Question>(); 
     qts.Add(question); 

     Repeater1.DataSource = qts; 
     Repeater1.DataBind(); 

    } 

当面は1つの質問を使用しています。私の質問を表示するラベルはうまく表示されますが、回答オプションを表示するためのラジオボタンは表示されません。私は多くのサンプルを見てきましたが、これはDBからDataTableまたはDataSet経由でデータを使用する人には有効です。しかし、データソース、DataValueField、およびDataTextFieldのパラメータをどれだけ使用しても、RadioButtonListはまったく不毛なままです。ご覧のとおり、当初はOptionの配列を使用していましたが、Listを試してみましたが役に立たなかったのです。

私はここで何が欠けていますか?


EDITは - 私が間違ってネストされた<asp:label><asp:radiobuttonlist>タグを持っていた私のミス を発見しました!ラベルはラジオボタンリストをカプセル化し、私が作ることができるものから問題を引き起こしていました。


ALTERNATIVE -

balexandreをbalexandreのおかげでコードのみ-behingを使用して実行可能な代替手段を提供しました。ありがとうございました!

私は、この代替案のコードリストを必要とし、この記事全体で発生する人のためにコードリストを掲載しています。

変更マークアップは次のように見て:

<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound"> 
     <ItemTemplate> 
      <%--<asp:Label ID="questionBody" runat="server" Text=<%# DataBinder.Eval(Container.DataItem, "Body") %>>--%> 
      <asp:Label ID="questionBody" runat="server" Text=<%# ((Question)Container.DataItem).Body %>> 
      </asp:Label> 
      <asp:radiobuttonlist ID="blah" runat="server" > 

      </asp:radiobuttonlist> 

     </ItemTemplate> 
    </asp:Repeater> 

とコードビハインド持っている必要がありますイベントハンドラ:

protected void Repeater1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) 
    { 

     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 

      RadioButtonList rbl = (RadioButtonList)e.Item.FindControl("blah"); 
      // do anything with your rbl 
      foreach (Option opt in question.Options) 
      { 
       rbl.Items.Add(opt.ToString()); 
      } 
     } 
    } 

答えて

1

あなただけOnItemDataBound魔女があるRepeaterメソッドを使用してテンプレートにアクセスすることができますがページに何かを描画する前に呼び出されます。

void Repeater1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) { 

    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { 

     RadioButtonList rbl = (RadioButtonList)e.Item.FindControl["blah"]; 
     // do anything with your rbl 

    } 
}  

それとも、ページをsubmitedいるRepeaterコレクション、例えば魔女内のすべてのコントロールをループによります。

ところで

、ちょうどあなたの情報について

このコード:

private string _body; 
private bool? _isCorrect; 

public string Body 
{ 
    get { return _body; } 
} 

public bool? IsCorrect 
{ 
    get { return _isCorrect; } 
} 

public string Body { private get; } 
public bool? IsCorrect { private get; } 
+0

おかげでRadioButtonListのを見つけることのあなたの方法と同じですコードの背後にあり、コンテンツの設定も同様に機能します。私はそれを以下のコードに含めました。 プロパティを作成するためのショートカットを使用しても、プライベートメンバーにはまだアクセスできますか?例:public string Body {private get; }、今はセッターが欲しくない、私の考えは、メンバーがコンストラクターを介してのみ設定されるようにし、getアクセサーでコンテンツを取得できるようにすることでした。コンストラクタで_bodyを使用することはできますか?それを受け入れるだろうか? – nikhilxp64

+0

私はこれを行うことができると思います: public string Body { get; プライベートセット; } – nikhilxp64

関連する問題