【问题标题】:How would i add this to a repeater?我如何将它添加到中继器?
【发布时间】:2012-07-23 18:46:31
【问题描述】:

早上,

我正在编写一个简单的测验应用程序。我从我的 MS SQL DB 中得到我的问题和答案。我将如何获得这个并将其放入中继器控件中,这样我就可以显示 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 是我的数据上下文。

提前致谢。

【问题讨论】:

    标签: c# asp.net linq-to-sql repeater asp.net-controls


    【解决方案1】:

    除了其他答案之外,这是一种非常简单的方法:

    假设您的 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; }
    }
    

    【讨论】:

    • 你是怎么得到这些的?我可以看到您作为数据源连接到 ods?
    • @Jupaol:完美的答案。 2年后帮助我!只是一个观察:问题类包含答案,答案类包含问题。循环引用,否则我遗漏了什么!
    【解决方案2】:

    这应该让你开始:

    标记:

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

    【讨论】:

      【解决方案3】:

      除了在repeater的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 和 Answers 将是您绑定列表/DataTable 的属性/列。

      【讨论】:

        【解决方案4】:

        如果您不知道每个问题的答案数量,您可以使用嵌套中继器

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

        【讨论】:

        • 'abc_quiz.Question' 不包含'Answers' 的定义,并且找不到接受'abc_quiz.Question' 类型的第一个参数的扩展方法'Answers'(您是否缺少 using 指令还是程序集参考?)是我得到的错误吗?有什么想法吗?
        • 您的问题对象不包含属性 answers,我认为。您必须再次从 dc 获取它们(请参阅我的编辑)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-29
        • 1970-01-01
        • 1970-01-01
        • 2023-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多