无法在ASP.NET Repeater模板中填充RadioButtonList



我正试图在ASP.NET Web表单中填充一个包含标签和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
}

和:

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
}

我的网络表单如下:

<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>

后面的代码是这样的:

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();
    }

目前我只使用一个问题。显示我的问题的标签显示得很好,但没有显示用于显示答案选项的单选按钮。我看过很多示例,当人们通过DataTable或DataSet使用DB中的数据时,这似乎对他们有效。然而,无论我如何使用Datasource、DataValueField和DataTextField参数,RadioButtonList都仍然是完全无效的。正如你所看到的,我最初使用了Option数组,也尝试了List,但没有成功。

我在这里错过了什么?


编辑-发现我的错误我的<asp:label><asp:radiobuttonlist>标签嵌套错误!标签封装了单选按钮列表,并从我所能理解的角度造成了问题。


备选方案-得益于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());
            }
        }
    }  

您只能使用Repeater方法访问模板。OnItemDataBound开关在将任何内容绘制到页面之前被调用。

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
    }
}    

或者通过循环浏览Repeater集合中的所有控件,例如切换您已提交的页面。


BTW,仅供参考

此代码:

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; }

最新更新