【问题标题】:(C#) columns "leaked" between datagridviews when changing between tabs(C#) 在选项卡之间更改时,datagridviews 之间的列“泄漏”
【发布时间】:2016-02-24 07:16:16
【问题描述】:

我正在尝试在 Visual Studio 中使用 c# 和 windows 窗体实现一个接口来处理数据库,但遇到了我无法解决的问题。我创建了一个包含一个 tabControl 和两个选项卡的表单,每个选项卡都有一个组合框,允许用户选择一个应用于选择查询的简单变量。 select 的结果将显示在 datagridview 中。现在,我确信选择语句是正确的,因为我尝试分别对它们中的每一个执行,所以我认为问题出在我的 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()
    }

}

现在,当我执行时,首先 tab1 中的 dataGridview1 包含上面列出的正确列,但是当我单击 tab2 时,dataGridView2 显示 FIELD3 和 FIELD4,当我再次单击 tab1 时,dataGridView1 也显示 FIELD5; 您能否指点我一些方向,以便我可以解决这个问题,因为我对 c# 和 windows 窗体还很陌生。 在此先感谢,很抱歉发了这么长的帖子

【问题讨论】:

  • 使用本地声明的 DataSet 变量并抛弃全局变量。

标签: c# winforms datagridview


【解决方案1】:

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

注意DataSet.Clear不会从数据集中移除已有的表,而是根据文档来的

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

要解决此问题,请不要使用共享数据集。删除 ds 字段并在两个地方简单地替换

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

var ds = new DataSet();  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多