2017-02-26 1 views
1

Ich habe viele wenn und sonst Aussagen und ich frage mich, wie ich es kurz und süß machen kann. Diese Funktion prüft, ob die Antwort, die der Benutzer in das Textfeld eingegeben hat, mit der Antwort im (versteckten) Datagrid übereinstimmt. Wenn es die gleiche ist 1 bis correctAnswer hinzufügen - die berechnet, wie viele richtige Antworten der Nutzer korrekt (vice versa für falsche Antwort) hatEntfernen von Code-Duplizierung in C#

bool firstAnswerCorrect = CheckAnswer(dataGridView1.Rows[0], textBoxQ1); 
     if (firstAnswerCorrect == true) 
     { 
      label1.Text = "correct"; 
      correctAnswers = correctAnswers + 1; 
     } 
     else 
     { 
      label1.Text = "incorrect"; 
      wrongAnswers = wrongAnswers + 1; 
     } 
     bool secondAnswerCorrect = CheckAnswer(dataGridView1.Rows[1], textBoxQ2); 
     if (firstAnswerCorrect == true) 
     { 
      label2.Text = "correct"; 
      correctAnswers = correctAnswers + 1; 
     } 
     else 
     { 
      label2.Text = "incorrect"; 
      wrongAnswers = wrongAnswers + 1; 
     } 
     bool thirdAnswerCorrect = CheckAnswer(dataGridView1.Rows[2], textBoxQ3); 
     if (thirdAnswerCorrect == true) 
     { 
      label3.Text = "correct"; 
      correctAnswers = correctAnswers + 1; 
     } 
     else 
     { 
      label3.Text = "incorrect"; 
      wrongAnswers = wrongAnswers + 1; 
     } 
     bool fourthAnswerCorrect = CheckAnswer(dataGridView1.Rows[3], textBoxQ4); 
     if (fourthAnswerCorrect == true) 
     { 
      label4.Text = "correct"; 
      correctAnswers = correctAnswers + 1; 
     } 
     else 
     { 
      label4.Text = "incorrect"; 
      wrongAnswers = wrongAnswers + 1; 
     } 
     bool fifthAnswerCorrect = CheckAnswer(dataGridView1.Rows[4], textBoxQ5); 
     if (fifthAnswerCorrect == true) 
     { 
      label5.Text = "correct"; 
      correctAnswers = correctAnswers + 1; 
     } 
     else 
     { 
      label5.Text = "incorrect"; 
      wrongAnswers = wrongAnswers + 1; 
     } 
     bool sixthAnswerCorrect = CheckAnswer(dataGridView1.Rows[5], textBoxQ6); 
     if (sixthAnswerCorrect == true) 
     { 
      label6.Text = "correct"; 
      correctAnswers = correctAnswers + 1; 
     } 
     else 
     { 
      label6.Text = "incorrect"; 
      wrongAnswers = wrongAnswers + 1; 
     } 
     bool seventhAnswerCorrect = CheckAnswer(dataGridView1.Rows[6], textBoxQ7); 
     if (seventhAnswerCorrect == true) 
     { 
      label7.Text = "correct"; 
      correctAnswers = correctAnswers + 1; 
     } 
     else 
     { 
      label7.Text = "incorrect"; 
      wrongAnswers = wrongAnswers + 1; 
     } 
     bool eighthAnswerCorrect = CheckAnswer(dataGridView1.Rows[7], textBoxQ8); 
     if (eighthAnswerCorrect == true) 
     { 
      label8.Text = "correct"; 
      correctAnswers = correctAnswers + 1; 
     } 
     else 
     { 
      label8.Text = "incorrect"; 
      wrongAnswers = wrongAnswers + 1; 
     } 
     bool ninethAnswerCorrect = CheckAnswer(dataGridView1.Rows[8], textBoxQ9); 
     if (ninethAnswerCorrect == true) 
     { 
      label9.Text = "correct"; 
      correctAnswers = correctAnswers + 1; 
     } 
     else 
     { 
      label9.Text = "incorrect"; 
      wrongAnswers = wrongAnswers + 1; 
     } 
     bool tenthAnswerCorrect = CheckAnswer(dataGridView1.Rows[9], textBoxQ10); 
     if (tenthAnswerCorrect == true) 
     { 
      label10.Text = "correct"; 
      correctAnswers = correctAnswers + 1; 
     } 
     else 
     { 
      label10.Text = "incorrect"; 
      wrongAnswers = wrongAnswers + 1; 
     } 
     label11.Text = ("YOU HAVE SCORED " + correctAnswers + " OUT OF 10"); 
     label12.Text = ("YOU HAVE " + wrongAnswers + " QUESTIONS WRONG"); 

Der Code funktioniert nur seine sich wiederholende

EDIT:

Diese Funktion berechnet nur die richtigen und falschen Antworten. Ich habe eine andere Funktion, die die Benutzereingabe in das Textfeld, wenn die Antwort überprüft ist das gleiche wie die Antwort in dem (versteckten) Datagrid

Dies ist der Code für diese Funktion:

private bool CheckAnswer(DataGridViewRow dataGridViewRow, TextBox textBox) 
    { 
     string correctAnswer = dataGridViewRow.Cells["answer"].Value.ToString(); 
     string givenAnswer = textBox.Text; 

     bool isCorrect = string.Equals(correctAnswer, givenAnswer, StringComparison.CurrentCultureIgnoreCase); 

     return isCorrect; 
    } 

Wie gesagt. Es funktioniert, aber es wiederholt sich nur, was kein gutes Zeichen ist.

EDIT:

Dies ist die neue C# -Code ich verwende, die den Code-Duplizierung ist beseitigt, jedoch traf ich eine Ausnahme, wenn ich es gezwickt ein bisschen.

List<TextBox> textboxes = new List<TextBox> { textBoxQ1, textBoxQ2, textBoxQ3, textBoxQ4, textBoxQ5, textBoxQ6, textBoxQ7, textBoxQ8, textBoxQ9, textBoxQ10 }; 
     List<Label> labels = new List<Label> { label1, label2, label3, label4, label5, label6, label7, label8, label9, label10 }; 
     bool temp; 
     for (int i = 0; i < 10; i++) 
     { 
      temp = CheckAnswer(dataGridView1.Rows[i], textboxes[i]); 
      if (temp == true) 
      { 
       labels[i].Text = "correct"; 
       correctAnswers = correctAnswers + 1; 

      } 
      else 
      { 
       labels[i].Text = "incorrect"; 
       wrongAnswers = wrongAnswers + 1; 
      } 
      label11.Text = ("YOU HAVE SCORED " + correctAnswers); 
      label12.Text = ("YOU HAVE SCORED " + correctAnswers); 
     } 

Eine nicht behandelte Ausnahme des Typs 'System.ArgumentOutOfRangeException' ist in mscorlib.dll aufgetreten

Zusätzliche Informationen: Index außerhalb des zulässigen Bereichs war. Muss nicht negativ und kleiner als die Größe der Sammlung sein.

Die Linie:

temp = CheckAnswer(dataGridView1.Rows[i], textboxes[i]); 
+1

Sie haben einen Fehler im zweiten Block: 'if (firstAnswerCorrect == true)'. –

+0

welche Art von Fehler? Es scheint für mich in Ordnung zu sein – CsharpStudent

+0

Werfen Sie einen Blick auf 'if' Zustand des ** zweiten ** Blocks. Es verwendet 'firstAnswerCorrect' Variable anstelle von' secondAnswerCorrect'. –

Antwort

5

Sie eine List<TextBox> und sie List<Label> wie unten machen kann:

List<TextBox> textboxes = new List<TextBox>{textbox1, ....} 
List<Label> labels = new List<Label>{label1, label2, ....} 
bool temp; 
for(int i = 0; i < 10; i++) 
{ 
    temp = CheckAnswer(dataGridView1.Rows[i], textBoxes[i]); 
    if (temp) 
    { 
     labels[i].Text = "correct"; 
     correctAnswers = correctAnswers + 1; 
    } 
    else 
    { 
     labels[i].Text = "incorrect"; 
     wrongAnswers = wrongAnswers + 1; 
    } 
} 
+0

Sorry, es gab einen Tippfehler in 'label [i] .Text =" incorrect ";' -> 'labels [i] .Text =" incorrect ";' Aber im Allgemeinen kannst du Benenne deine Variable, was immer du willst. Stellen Sie nur sicher, dass Sie diese Variable verwenden. Wenn Sie wieder ein Problem haben, lassen Sie mich wissen, was das Problem ist –

+0

schön gemacht Sir – CsharpStudent

+0

Froh, dass es geholfen :) –

0

speichere ich würde alle Antworttextfelder und korrekte/falsche Antwort Etiketten in einer Anordnung, wie Label[] answerLabels und TextBox[] answerTextBoxes. Diese Arrays sollten richtig geordnet sein, d. H. answerLabels[0] und answerTextBoxes[0] sollten der ersten Frage entsprechen, answerLabels[1] und answerTextBoxes[1] sollten der zweiten Frage entsprechen und so weiter.

Danach wird dies ein einziges for-Schleife:

for(int i = 0; i < answerLabels.Length; i++) { 
    bool answerCorrect = CheckAnswer(dataGridView1.Rows[i], answerTextBoxes[i]); 
    if (answerCorrect == true) 
    { 
     answerLabels[i].Text = "correct"; 
     correctAnswers = correctAnswers + 1; 
    } 
    else 
    { 
     answerLabels[i].Text = "incorrect"; 
     wrongAnswers = wrongAnswers + 1; 
    } 
} 
+0

Hört sich gut an, ich probiere es aus – CsharpStudent

1

versucht Mai Wiederholung in der folgenden Art und Weise zu reduzieren:

List<TextBox> textBoxList = new List<TextBox>() { 
    textBoxQ1, 
    textBoxQ2, 
    ... 
    textBoxQN 
}; 

List<Label> labelList = new List<Label>() { 
    label1, 
    label2, 
    ... 
    labelN 
}; 

for(int i = 0; i < textBoxList.Count; i++) { 
    bool answerCorrect = CheckAnswer(dataGridView1.Rows[i], textBoxList[i]); 
    labelList[i].Text = answerCorrect ? "correct" : "incorrect"; 
    correctAnswers += answerCorrect ? 1 : 0; 
    wrongAnswers += !answerCorrect ? 1 : 0; 
} 
-2

Eine einfache Lösung würde sich ändern rything zu Strings statt Booleans. Auf diese Weise benötigen Sie keine if Anweisungen. label1.Text = firstAnswerCorrect nur die equals (String) entweder "correct" oder "incorrect"

Und für die Funktion würden Sie nur zurückgeben "correct" oder "incorrect"

Hoffnung, das hilft.