2017-04-17 1 views
1

J'ai cherché une réponse à mon problème depuis un certain temps maintenant et je n'ai pas trouvé de solution. PS: Je travaille sur un jeu Quiz en allemand, donc vous ne serez peut-être pas capable de comprendre les noms de variables etc., mais je pense que cela ne devrait pas être le problème.L'édition de DataTable ne s'affiche pas correctement

J'ai un DataTable avec 8 colonnes dans la classe SQL, et dans la dernière colonne, il est un 0.

namespace Quiz 
{ 
    class SQL 
    { 
     public static DataTable GEO_Fragen() 
     { 
      using (DataTable GEO = new DataTable("Geografie")) 
      { 

       GEO.Columns.Add("ID", typeof(int)); 
       GEO.Columns.Add("Frage", typeof(string)); 
       GEO.Columns.Add("Antwort 1", typeof(string)); 
       GEO.Columns.Add("Antwort 2", typeof(string)); 
       GEO.Columns.Add("Antwort 3", typeof(string)); 
       GEO.Columns.Add("Antwort 4", typeof(string)); 
       GEO.Columns.Add("Richtige Antwort", typeof(int)); 
       GEO.Columns.Add("Gefragt", typeof(int)); 

       GEO.Rows.Add(0, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(1, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(2, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(3, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(4, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(5, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(6, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(7, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(8, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(9, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(10, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(11, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(12, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(13, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(14, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(15, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(16, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(17, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(18, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 
       GEO.Rows.Add(19, "Question", "Answer 1", "Answer 2", "Answer 3", "Answer 4", 4, 0); 

       return GEO; 
      } 
     } 
     //...more code 

Dans une autre classe, je choisis une question au hasard. Si cette question a un "1" dans la dernière colonne (signifiant qu'elle a déjà été utilisée), elle en génère une autre.

public void Zufallszahl() 
{ 
    zufall = rnd.Next(0, SQL.GEO_Fragen().Rows.Count); 
    if (SQL.GEO_Fragen().Rows[zufall]["Gefragt"].ToString() == "1") 
    { 
     Zufallszahl(); 
    } 
    else 
    { 
     lbl_Frage.Text = SQL.GEO_Fragen().Rows[zufall]["Frage"].ToString(); //Filling in a random Question and Answers 
     rad_Antwort1.Text = SQL.GEO_Fragen().Rows[zufall]["Antwort 1"].ToString(); 
     rad_Antwort2.Text = SQL.GEO_Fragen().Rows[zufall]["Antwort 2"].ToString(); 
     rad_Antwort3.Text = SQL.GEO_Fragen().Rows[zufall]["Antwort 3"].ToString(); 
     rad_Antwort4.Text = SQL.GEO_Fragen().Rows[zufall]["Antwort 4"].ToString(); 

     rad_Antwort1.Checked = false; // No radio button is ticked 
     rad_Antwort2.Checked = false; 
     rad_Antwort3.Checked = false; 
     rad_Antwort4.Checked = false; 
    } 
} 

Et maintenant le vrai problème: Quand je change la valeur de la dernière colonne de la ligne que j'ai choisi au hasard, il le fait vraiment peu de temps dans le mode de débogage. Mais juste après cela, quand je me laisse montrer la valeur de cette cellule, elle affiche à nouveau "0".

private void btn_Weiter_Click(object sender, EventArgs e) 
{ 
    if (rad_Antwort1.Checked == true || rad_Antwort2.Checked == true || rad_Antwort3.Checked == true || rad_Antwort4.Checked == true) 
    { 
     Pruefen(); // Checking the chosen answer 
     lbl_Score.Text = "Punkte: " + Punkte; // Current points 
     string kontrolle = SQL.GEO_Fragen().Rows[zufall]["Antwort 1"].ToString(); 
     SQL.GEO_Fragen().Rows[zufall]["Gefragt"] = 1; //Changing value of the last column in row "zufall" to "1" 
     MessageBox.Show(SQL.GEO_Fragen().Rows[zufall]["Gefragt"].ToString()); //Shows "0" instead of "1" 

     if (rad_Antwort1.Text == kontrolle) // Next question 
     { 
      Zufallszahl(); 
      while (Counter <= 10) 
      { 
       Counter = Counter + 1; 
       break; 
      } 

      if (Counter > 10) 
      { 
       SQL.GEO_Fragen().Reset(); 
       btn_Weiter.Hide(); // After 10 questions back to main menu 
       lbl_Frage.Hide(); 
       rad_Antwort1.Hide(); 
       rad_Antwort2.Hide(); 
       rad_Antwort3.Hide(); 
       rad_Antwort4.Hide(); 
       lbl_Titel.Show(); 
       lbl_Themen.Show(); 
       rad_Geografie.Show(); 
       rad_Geschichte.Show(); 
       rad_Serien.Show(); 
       rad_Videospiele.Show(); 
       btn_Start.Show(); 
      } 
      //... more code 

J'ai essayé beaucoup de choses différentes, je l'ai essayé avec AcceptChanges(), BeginEdit() et EndEdit(). Juste à des fins de débogage j'ai également essayé de mettre le DataTable et la commande d'édition dans une méthode. L'édition fonctionne alors parfaitement.

Répondre

0

Chaque fois que vous appelez votre méthode GEO_Fragen(), elle crée une nouvelle instance du DataTable. Vous mettez donc à jour une instance et vérifiez une instance complètement différente, ce qui explique pourquoi elle ne semble pas être mise à jour.

Vous pouvez mettre en œuvre le modèle de conception Singleton en ajoutant un champ statique et propriété à votre SQL classe:

private static DataTable geoFragenInstance; 

public static DataTable GeoFragenInstance 
{ 
    get 
    { 
     if (geoFragenInstance == null) 
     { 
      geoFragenInstance = GEO_Fragen(); 
     } 

     return geoFragenInstance; 
    } 
} 

Pour assurer qu'il n'y a que jamais une instance de SQL vous devez également ajouter un constructeur par défaut privé:

private SQL() {} 

Sinon, vous obtiendrez un public par défaut.

Je voudrais aussi faire votre méthode GEO_Fragen()private

Remplacez ensuite toutes vos références à SQL.GEO_Fragen() avec SQL.GeoFragenInstance

S'il vous plaît noter que ceci est la plus simple mise en œuvre du Singleton et entre autres choses est thread-safe (qui pourrait être bien pour vos fins).

Pour en savoir plus ici:

Implementing Singleton in C#

Design Patterns - Singleton Pattern (4 Examples)

+0

Merci beaucoup! Il semble que cela a fonctionné! Désolé de ne pas avoir répondu plus vite, j'avais beaucoup à faire :). – Racer4443

+0

Pas de problèmes, @ Racer4443, je sais ce que tu veux dire;) et heureux d'être d'aide :) – davmos