2017-04-17 7 views
1

私はかなり長い間、私の問題に対する答えを探していましたが、解決策が見つかりませんでした。 PS:私はドイツ語でクイズゲームをしていますので、変数名などを理解できないかもしれませんが、問題ではないと思います。DataTableの編集が正しく表示されない

私はクラスSQLで8列とのDataTableを持って、そして最後の列に別のクラスは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 

があり、私はランダムな質問を選択しています。この質問に最後の列に "1"がある場合(以前に使用されていたことを意味します)、別の列が生成されます。

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

そして今、本当の問題へ

:私は私がランダムに選択した行の最後の列の値を変更していた場合、それはデバッグモードでそう本当にすぐにやっています。しかし、その直後に、このセルの値を表示させると、再び "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 

私は私がAcceptChanges()BeginEdit()EndEdit()でそれを試してみましたが、多くの異なるものを試してみました。デバッグ目的のために、DataTableとedit-commandを1つのメソッドに入れようとしました。編集は完全に機能します。

答えて

0

GEO_Fragen()メソッドを呼び出すたびに、DataTableの新しいインスタンスが作成されます。したがって、あるインスタンスを更新して完全に異なるインスタンスをチェックしているため、更新されていないように見えます。

あなたのSQLクラスに静的フィールドとプロパティを追加することによって、シングルトンデザインパターンを実装することができます:

private static DataTable geoFragenInstance; 

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

     return geoFragenInstance; 
    } 
} 

あなたもプライベート既定のコンストラクタを追加する必要がありますSQLのしかつのインスタンスがあることを確認するには、次の

private SQL() {} 

それ以外の場合は、デフォルトで公開されます。

私はまた、その後SQL.GeoFragenInstance

SQL.GEO_Fragen()にすべての参照を置き換えるあなたのGEO_Fragen()方法private

になるだろうこれを注意してくださいシングルトンの最も簡単な実装であり、とりわけスレッドセーフではありません(これはあなたの目的のためにうまくいくかもしれません)。ここ

さらに読書:

Implementing Singleton in C#

Design Patterns - Singleton Pattern (4 Examples)

+0

はどうもありがとうございました!それは働いたようです!早く答えることができなかったのは申し訳ありません。 – Racer4443

+0

probsは、@ Racer4443、私はあなたが何を意味知っている;)&援助の喜んで:) – davmos

関連する問題