DataTable编辑显示不正确
DataTable edit is not displayed correctly
我已经为我的问题寻找答案很长一段时间了,但我还没有找到解决方案。 PS: 我正在做一个德语问答游戏,所以你可能无法理解变量名等,但我认为这应该不是问题。
我有一个数据表,在 class SQL
中有 8 列,在最后一列中有一个 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
在另一个 class 中,我正在选择一个随机问题。如果这个问题在最后一列中有一个“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 和编辑命令放入一个方法中。然后编辑工作完美。
每次调用 GEO_Fragen()
方法时,它都会创建一个新的 DataTable 实例。所以你正在更新一个实例并检查一个完全不同的实例,这就是它似乎没有更新的原因。
您可以通过向 SQL
class:
添加静态字段和 属性 来实现单例设计模式
private static DataTable geoFragenInstance;
public static DataTable GeoFragenInstance
{
get
{
if (geoFragenInstance == null)
{
geoFragenInstance = GEO_Fragen();
}
return geoFragenInstance;
}
}
为了确保 SQL
只有一个实例,您还应该添加一个私有默认构造函数:
private SQL() {}
否则你会默认得到一个public。
我也会让你的GEO_Fragen()
方法private
然后将所有对 SQL.GEO_Fragen()
的引用替换为 SQL.GeoFragenInstance
请注意,这是 Singleton 的最简单实现,除此之外,它不是线程安全的(这可能适合您的目的)。
在这里进一步阅读:
我已经为我的问题寻找答案很长一段时间了,但我还没有找到解决方案。 PS: 我正在做一个德语问答游戏,所以你可能无法理解变量名等,但我认为这应该不是问题。
我有一个数据表,在 class SQL
中有 8 列,在最后一列中有一个 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
在另一个 class 中,我正在选择一个随机问题。如果这个问题在最后一列中有一个“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 和编辑命令放入一个方法中。然后编辑工作完美。
每次调用 GEO_Fragen()
方法时,它都会创建一个新的 DataTable 实例。所以你正在更新一个实例并检查一个完全不同的实例,这就是它似乎没有更新的原因。
您可以通过向 SQL
class:
private static DataTable geoFragenInstance;
public static DataTable GeoFragenInstance
{
get
{
if (geoFragenInstance == null)
{
geoFragenInstance = GEO_Fragen();
}
return geoFragenInstance;
}
}
为了确保 SQL
只有一个实例,您还应该添加一个私有默认构造函数:
private SQL() {}
否则你会默认得到一个public。
我也会让你的GEO_Fragen()
方法private
然后将所有对 SQL.GEO_Fragen()
的引用替换为 SQL.GeoFragenInstance
请注意,这是 Singleton 的最简单实现,除此之外,它不是线程安全的(这可能适合您的目的)。
在这里进一步阅读: