2010-09-26 4 views
0

Salutations, je voudrais simplement demander comment puis-je récupérer des données rangées dans ma table dans ma base de données au hasard ... j'ai pu créer un jeu-questionnaire en ligne où il affiche la question, les choix dans l'ordre consécutif, mais ce que je veux, c'est que chaque fois que l'utilisateur va commencer un quiz, il affichera des questions dans un ordre aléatoire. J'utilise MSSQL 2005 comme ma base de données ci-dessous est mon code .. des conseils ou des suggestions est très recherché .. merci et bonne journée ..Questions au hasard à l'aide DetailsView (Aide) tout le monde

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 

Répondre

1

Alors que la recherche d'une solution à votre problème, je suis tombé sur ce poste:

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

en utilisant ORDER BY NEWID() dans l'instruction Select SQL vous pouvez randomiser le résultat ev Chaque fois que vous récupérez les enregistrements. Je l'ai essayé sur SQL Server 2008 et fonctionne avec brio pour plus de 100 enregistrements. Donc, tout ce que vous devez faire est de modifier votre SQL Select:

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

L'autre alternative est de créer une fonction RandomizeDataTable qui randomiser l'ordre des lignes. Si la solution ci-dessus ne fonctionne pas pour vous, nous pouvons y jeter un coup d'œil.

+0

Grand .. merci ^^ maxthephilosopher, – Kid

1
  • ne pas utiliser un sQLData La source.
  • Charger les lignes une fois, dans le code-behind
  • shuffle la List<Question>
  • stocker la liste dans l'objet Session
+0

merci pour la réponse rapide Monsieur Henk, je l'espère ne vous dérange pas .. pouvez-vous me montrer comment faire cela? parce que honnêtement je ne comprends pas l'idée « shuffle » beaucoup .. s'il vous plaît aidez-moi .. merci – Kid

+0

En savoir plus sur brassage: http://en.wikipedia.org/wiki/Swap_%28computer_science%29#Using_a_temporary_variable – citronas

+0

i ont modifié les codes ci-dessus changeant en ne pas utiliser SqlDataSource mais soudainement je rencontré un problème où une fois que la page est chargée, il montre la première question, mais quand je frappe le bouton suivant il n'y a pas de sortie ... où je me attends qu'il devrait encore être le prochain questions ... – Kid