(C#) 在选项卡之间更改时,列在数据网格视图之间“泄漏”

本文关键字:之间 网格 数据网 数据 泄漏 视图 选项 | 更新日期: 2023-09-27 18:36:01

我正在尝试实现一个接口来处理Visual Studio中的c#和Windows表单的数据库,并遇到了我无法解决的问题。我创建了一个包含 tabControl 和两个选项卡的窗体,每个选项卡都有一个组合框,允许用户选择应用于选择查询的简单变量。选择的结果将显示在数据网格视图中。现在,我确信 select 语句是正确的,因为我尝试分别执行每个语句,所以我认为问题出在我对 datagridviews 的实现中。发生的情况是,当我第一次执行时,第一个选项卡中的结果是正确的,但是当我单击包含 datagridview2 的第二个选项卡时,它显示的列只应该显示在第一个选项卡中,而不会出现在第二个选择语句中。更奇怪的是,当我回到第一个选项卡时,datagridview1 的列也会发生同样的事情。这是我的代码的样子

private void combobox1_SelectedIndexChanged(object sender, EventArgs e)
{
   string ConStr = "myConnectionString";
   MySqlConnection DBCon = new MySqlConnection(conStr);
   string query = "SELECT field1, field2, field3, field4 FROM table1, table2 WHERE field1 = " + comboBox1.Text + ";";
   MySqlDataAdapter da = new MySqlDataAdapter(query, DBCon);
   if (ds != null)
   {
      ds.Clear();
   }
   da.Fill(ds);
   dataGridView1.DataSource = ds.Tables[0];
   dataGridView1.Columns[field1].HeaderText = "FIELD1";
   dataGridView1.Columns[field2].HeaderText = "FIELD2";
   dataGridView1.Columns[field3].HeaderText = "FIELD3";
   dataGridView1.Columns[field4].HeaderText = "FIELD4";
   if (DBCon != null)
   {
      DBCon.Close()
    }
}
private void combobox2_SelectedIndexChanged(object sender, EventArgs e)
{
   string ConStr = "myConnectionString";
   MySqlConnection DBCon = new MySqlConnection(conStr);
   string query = "SELECT field1, field4, field5 FROM table1 WHERE field1 = " + comboBox2.Text + ";";
   MySqlDataAdapter da = new MySqlDataAdapter(query, DBCon);
   if (ds != null)
   {
      ds.Clear();
   }
   da.Fill(ds);
   dataGridView2.DataSource = ds.Tables[0];
   dataGridView2.Columns[field1].HeaderText = "FIELD1";
   dataGridView2.Columns[field4].HeaderText = "FIELD4";
   dataGridView2.Columns[field5].HeaderText = "FIELD5";
   if (DBCon != null)
   {
      DBCon.Close()
    }
}

现在,当我执行时,首先选项卡 1 中的 dataGridview1 包含上面列出的正确列,但是当我单击选项卡 2 时,dataGridView2 显示 FIELD3 和 FIELD4,当我单击选项卡 1 时,dataGridView1 也显示 FIELD5;您能否指出我某个方向,以便我可以解决此问题,因为我对 c# 和 windows 表单相当陌生。提前感谢,很抱歉长篇大论

(C#) 在选项卡之间更改时,列在数据网格视图之间“泄漏”

问题是您在两者之间使用共享(通用)DataSetDataTable

请注意,DataSet.Clear 不会从数据集中删除现有表,而是根据文档

通过删除所有表中的所有行来清除数据集中的任何数据

要解决此问题,请不要使用共享数据集。删除ds字段,只需在两个位置替换即可

if (ds != null)
{
    ds.Clear();
}

var ds = new DataSet();