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