2010-09-26 1 views
0

Приветствую всех, я просто хотел бы спросить, как я случайно извлекаю строки данных в своей таблице в своей базе данных ... Я смог создать онлайн-опрос, в котором он отображает вопрос, выбор в последовательном порядке, но я хочу, каждый раз, когда пользователь начнет викторину, он будет отображать вопросы в случайном порядке. Я использую MSSQL 2005, как моя база данных ниже мой код .. любые советы или предложения высоко ценятся .. спасибо и есть великий день ..Случайные вопросы с помощью DetailsView (Help)

QuizPage.aspx

<asp:DetailsView ID="questionDetails" runat="server" AutoGenerateRows="False" 
       CellPadding="4" ForeColor="#333333" 
       GridLines="None" Height="50px" Width="550px"> 
       <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
       <CommandRowStyle BackColor="#E2DED6" Font-Bold="True" /> 
       <RowStyle BackColor="#F7F6F3" CssClass="generaltext" ForeColor="#333333" /> 
       <FieldHeaderStyle BackColor="#E9ECF1" CssClass="boldtext" Font-Bold="True" 
        Width="80px" /> 
       <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> 
       <Fields> 
        <asp:TemplateField HeaderText="Question ID">   
         <ItemTemplate> 
             <asp:Label ID="question_id" runat="server" Text='<%# Bind("question_id") %>'></asp:Label> 
         </ItemTemplate>                    
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Question:">   
         <ItemTemplate> 
             <asp:Label ID="quiz_question" runat="server" Text='<%# Bind("quiz_question") %>'></asp:Label> 
         </ItemTemplate>                    
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Choice 1:">   
         <ItemTemplate> 
             <asp:Label ID="choice1" runat="server" Text='<%# Bind("choice1") %>'></asp:Label> 
         </ItemTemplate>                    
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Choice 2:">   
         <ItemTemplate> 
             <asp:Label ID="choice2" runat="server" Text='<%# Bind("choice2") %>'></asp:Label> 
         </ItemTemplate>                    
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Choice 3:">   
         <ItemTemplate> 
             <asp:Label ID="choice3" runat="server" Text='<%# Bind("choice3") %>'></asp:Label> 
         </ItemTemplate>                    
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Choice 4:">   
         <ItemTemplate> 
             <asp:Label ID="choice4" runat="server" Text='<%# Bind("choice4") %>'></asp:Label> 
         </ItemTemplate>                    
         </asp:TemplateField> 
       </Fields> 
       <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
       <EditRowStyle BackColor="#999999" /> 
       <AlternatingRowStyle BackColor="White" CssClass="generaltext" 
        ForeColor="#284775" /> 
      </asp:DetailsView> 

    Your Answer:&nbsp; 
      <asp:DropDownList ID="answerDropDownList" runat="server" 
       style="margin-bottom: 0px"> 
       <asp:ListItem Value="1">Answer 1</asp:ListItem> 
       <asp:ListItem Value="2">Answer 2</asp:ListItem> 
       <asp:ListItem Value="3">Answer 3</asp:ListItem> 
       <asp:ListItem Value="4">Answer 4</asp:ListItem> 
      </asp:DropDownList> 

    <asp:Button ID="buttonNext" runat="server" Text="Next" /> 

QuizPage.aspx.vb

Private Function CreateConnection() As SqlConnection 
    Dim _connectionString As String = ConfigurationManager.ConnectionStrings("LMSConnectionString").ConnectionString 
    Return New SqlConnection(_connectionString) 
End Function 
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If Not IsPostBack Then 
     getQuestions() 
    End If 
End Sub 
Private Sub getQuestions() 
    Dim quiz_id As Integer 
    quiz_id = Session("quiz_id") 
    Dim connection As SqlConnection = CreateConnection() 
    Dim command As SqlCommand = Nothing 
    Dim dt As DataTable = New DataTable() 
    command = New SqlCommand("SELECT question_id,quiz_question, choice1, choice2, choice3, choice4, answer, quiz_id FROM tblQuizQuestion WHERE (quiz_id = @quiz_id)", connection) 
    command.Parameters.AddWithValue("@quiz_id", quiz_id) 
    Dim ad As SqlDataAdapter = New SqlDataAdapter(command) 
    ad.Fill(dt) 
    questionDetails.DataSource = dt 
    questionDetails.DataBind() 
End Sub 
Protected Sub buttonNext_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles buttonNext.Click 

    Try 

     ' Save off previous answers 
     Dim dr As System.Data.DataRowView 
     dr = CType(questionDetails.DataItem, System.Data.DataRowView) 

     ' Create Answer object to save values 
     Dim a As Answer = New Answer() 
     ' a.QuestionID = dr("QuestionOrder").ToString() 
     a.CorrectAnswer = dr("answer").ToString() 
     a.UserAnswer = answerDropDownList.SelectedValue.ToString() 

     Dim al As ArrayList 
     al = CType(Session("AnswerList"), ArrayList) 
     al.Add(a) 

     Session.Add("AnswerList", al) 

    Catch ex As Exception 


     Response.Redirect("default.aspx") 
    End Try 

    If questionDetails.PageIndex = questionDetails.PageCount - 1 Then 
     ' Go to evaluate answers 
     Response.Redirect("results.aspx") 
    Else 
     questionDetails.PageIndex += 1 

    End If 

    If questionDetails.PageIndex = questionDetails.PageCount - 1 Then 
     buttonNext.Text = "Finished" 
    End If 
End Sub 

ответ

1

При поиске решения вашей проблемы, я наткнулся на этот пост:

http://haacked.com/archive/2004/06/21/658.aspx

с помощью ORDER BY NEWID() в окне Выбор оператора SQL вы можете рандомизировать результат эв за один раз, когда вы извлекаете записи. Я попробовал это на SQL Server 2008 и блестяще работает для более чем 100 записей. Так что все, что вам нужно сделать, это изменить свой Select SQL для:

SELECT question_id,quiz_question, choice1, choice2, choice3, choice4, answer, quiz_id FROM tblQuizQuestion WHERE (quiz_id = @quiz_id) ORDER BY NEWID() 

Другой альтернативой является создание RandomizeDataTable функции, которая будет Рандомайзом порядка строк. Если вышеуказанное решение не работает для вас, мы можем взглянуть на это.

+0

Отлично .. спасибо maxthephilosopher ^^, – Kid

1
  • не используйте Sqldata Источник.
  • нагрузки Ряды один раз, в коде-за
  • shuffleList<Question>
  • сохранить список в объекте Session
+0

спасибо за быстрый ответ Сэр Хенк, я надеюсь, вы не против .. вы можете показать мне, как это сделать? потому что, честно говоря, я не понимаю идею «перетасовать». Пожалуйста, помогите мне спасибо .. – Kid

+0

Подробнее о перетасовке: http://en.wikipedia.org/wiki/Swap_%28computer_science%29#Using_a_temporary_variable – citronas

+0

Я отредактировал приведенные выше коды меняют его на использование SqlDataSource, но неожиданно я столкнулся с проблемой, когда после загрузки страницы он показывает первый вопрос, но когда я нажимаю следующую кнопку, нет выхода ... там, где я ожидаю, что еще должно быть следующее вопросы ... – Kid

Смежные вопросы