0

朝、

簡単なクイズアプリを書いています。MSSQLDBから質問と回答を受け取っています。これを取得してリピーターコントロールと言うにはどうすればよいでしょうか。6つの質問とその回答を表示できます。

または...これを行うためのより良い方法を知っていますか?

 var questions = dc.Questions.ToList().OrderBy(q => Guid.NewGuid()).Take(6);

        foreach (var q in questions)
        {
            litQuestion.Text = q.question1;
            int qId = q.id;

            var ans = dc.Answers.Where(a => a.questionId == qId).ToList();

            litAnswer1.Text = ans[0].answer1.ToString();
            litAnswer2.Text = ans[1].answer1.ToString();
            litAnswer3.Text = ans[2].answer1.ToString();
        }

dcは私のデータコンテキストです。

前もって感謝します。

4

4 に答える 4

2

他の答えに加えて、これはそれを行うための本当に簡単な方法です:

QuestionオブジェクトにAnswersと呼ばれる利用可能な回答のコレクションが含まれていると仮定します

<asp:Repeater runat="server" DataSourceID="ods">
    <ItemTemplate>
        <%# Eval("QuestionText") %>
        <br />
        <asp:RadioButtonList runat="server" DataSource='<%# Eval("Answers") %>' DataTextField="AnswerText" DataValueField="ID">
        </asp:RadioButtonList>
    </ItemTemplate>
</asp:Repeater>

これは次のようなものを生成します:

ここに画像の説明を入力してください

編集1

odsデータソース:

    <asp:ObjectDataSource ID="ods" runat="server" 
        SelectMethod="GetQuestions" 
        TypeName="WebApplication1.Questions.QuestionsContext">
    </asp:ObjectDataSource>

    public IEnumerable<Question> GetQuestions()
    {
        // return your questions
    }

public class Question
{
    public Guid ID { get; set; }
    public string QuestionText { get; set; }
    public IEnumerable<Answer> Answers { get; set; }
    public bool MultipleAnswers { get; set; }
    public bool IsCorrect { get; set; }

    public Question()
    {
        this.Answers = Enumerable.Empty<Answer>();
    }
}
public class Answer
{
    public Guid ID { get; set; }
    public Question Question { get; set; }
    public bool IsCorrect { get; set; }
    public string AnswerText { get; set; }
    public bool WasSelected { get; set; }
}
于 2012-07-23T09:38:57.390 に答える
0

これで始められるはずです:

マークアップ:

<asp:repeater ID="repeater" runat="server" OnItemDataBound="repeater_OnItemDataBound">
    <ItemTemplate>
           <asp:Label id="lblQuestion" runat="server" />
           <asp:Label id="lblAnswer" runat="server" />                 
    </ItemTemplate>
</asp:repeater>     

背後にあるコード:

public void repeater_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
    {
        Label lblQuestion = (Label)e.Item.FindControl("lblQuestion");
        Label lblAnswer = (Label)e.Item.FindControl("lblAnswer");

        //Your logic for getting the questions and answers per iteration
    }
}
于 2012-07-23T09:10:41.537 に答える
0

質問ごとの回答数がわからない場合は、ネストされたリピーターを使用できます

<asp:Repeater runat="server" ID="questionsRep" OnItemDataBound="QuestionsRep_ItemDataBound">

        <ItemTemplate>
            <asp:Label runat="server" Text='<%# Eval("question1") %>'></asp:Label>
            <asp:Label runat="server" Text='<%# Eval("id") %>'></asp:Label>

            <asp:Repeater runat="server" ID="answersRep">

                <ItemTemplate>
                    <asp:Label runat="server" Text='<%# Eval("answer1") %>'></asp:Label>
                </ItemTemplate>

            </asp:Repeater>

        </ItemTemplate>

    </asp:Repeater>

リピーターのDatabound-Eventで、回答をバインドします

protected void QuestionsRep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType ==    
    ListItemType.AlternatingItem))
    {
        Question q = (Question)e.Item.DataItem;
        var answers = dc.Answers.Where(a => a.questionId == q.id).ToList();
        Repeater answersRep = (Repeater)e.Item.FindControl("answersRep");
        answersRep.DataSource = answers;
        answersRep.DataBind();
    }
}
于 2012-07-23T09:28:15.223 に答える
0

リピーターのDataBoundイベントにバインドする代わりに、サーバー側のタグを使用することもできます(質問と回答を表示しているだけの場合)。

aspx:

        <asp:Repeater ID="quizRepeater" runat="server">
    <ItemTemplate>
        <div class="fullWidthDiv">
            <span class="rightAlignedForQuestion">
                <asp:Label ID="questionNumberLabel" runat="server">
        Question
        <%# DataBinder.Eval(Container.DataItem,"QuestionNumber") %>:
                </asp:Label>
            </span><span class="leftAlignedForQuestion">
                <label>
                    <%# DataBinder.Eval(Container.DataItem,"Question") %>
                </label>
            </span>
        </div>
        <div class="fullWidthDiv">
            <span class="leftAlignedForOptions">
            Correct Answer: 
                <asp:Label CssClass="boldFont" id="correctAnswerLabel" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"Answer") %>'>
                </asp:Label>
            </span>
        </div>
    </ItemTemplate>
</asp:Repeater>

QuestionNumber、Question and Answersは、バインディングリスト/DataTableのプロパティ/列になります。

于 2012-07-23T09:29:29.383 に答える