2017-04-17 1 views
1

저는 현재 내 문제에 대한 해결책을 오랫동안 찾고 있었으며 해결책을 찾지 못했습니다. 추신 : 저는 독일어로 퀴즈 게임을하고 있습니다. 따라서 변수 이름 등을 이해하지 못할 수도 있지만 문제는 아닙니다.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를 하나의 메소드에 넣으려고했습니다. 편집은 완벽하게 작동합니다.

답변

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() {} 

그렇지 않으면 공개적으로 공개됩니다.

또한 스레드 안전 (private

다음이가 싱글과 다른 것들 사이에 간단한 구현 유의하시기 바랍니다 SQL.GeoFragenInstance

SQL.GEO_Fragen()에 대한 모든 참조를 대체하여 GEO_Fragen() 방법은 아닙니다 할 것이다 당신의 목적을 위해 좋을지도 모른다). 여기

추가 읽기 :

Implementing Singleton in C#

Design Patterns - Singleton Pattern (4 Examples)

+0

대단히 감사합니다! 그것이 효과가있는 것처럼 보인다! 더 빨리 대답하지 못해 미안해, 나는 끝내야 할 것이 많았다. :) – Racer4443

+0

probs, @ Racer4443, 나는 당신이 의미하는 것을 안다;) & 도움이 될 수있어서 기쁩니다 :) – davmos

관련 문제