C# (C) 在选项卡之间更改时,DataGridView之间的列“泄漏”

C# (C) 在选项卡之间更改时,DataGridView之间的列“泄漏”,c#,winforms,datagridview,C#,Winforms,Datagridview,我试图在VisualStudio中实现一个使用c和windows窗体处理db的接口,但遇到了一个我无法解决的问题。我创建了一个表单,其中包含一个tabControl和两个tab,每个tab都有一个组合框,允许用户选择应用于select查询的简单变量。选择的结果将显示在datagridview中。现在,我确信select语句是正确的,因为我已经尝试分别使用它们来执行,所以我认为问题在于DataGridView的实现。当我第一次执行时,第一个选项卡中的结果是正确的,但是当我单击包含datagridv

我试图在VisualStudio中实现一个使用c和windows窗体处理db的接口,但遇到了一个我无法解决的问题。我创建了一个表单,其中包含一个tabControl和两个tab,每个tab都有一个组合框,允许用户选择应用于select查询的简单变量。选择的结果将显示在datagridview中。现在,我确信select语句是正确的,因为我已经尝试分别使用它们来执行,所以我认为问题在于DataGridView的实现。当我第一次执行时,第一个选项卡中的结果是正确的,但是当我单击包含datagridview2的第二个选项卡时,它显示的列应该只显示在第一个选项卡中,而不显示在第二个select语句中。更奇怪的是,当我回到第一个选项卡时,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()
    }

}
现在,当我执行时,首先tab1中的dataGridview1包含上面列出的正确列,但当我单击tab2时,dataGridView2显示字段3和字段4,当我单击tab1时,dataGridview1也显示字段5; 你能告诉我一些方向吗?这样我就可以解决这个问题了,因为我对c和windows窗体还比较陌生。
提前感谢并为这篇长篇大论感到抱歉。问题是,您正在两者之间使用一个共享的公共数据集和数据表

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

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

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

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


问题在于,您正在两者之间使用一个共享的公共数据集和数据表

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

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

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

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


使用局部声明的数据集变量并舍弃全局变量。使用局部声明的数据集变量并舍弃全局变量。