当我从ComboBox
中选择一个表时,将获得该表中存在的每一列(并有一个在我检查时将其隐藏的选项)。
当我从“组合框”中选择下一个表时,我将获得新表列以及第一个表中的前一个表列。
如何解决此问题并仅保存选定的表列?
private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
var tableName = comboBox1.SelectedItem;
sqlDa = new SqlDataAdapter($"SELECT * FROM {tableName}", form1.conn = new SqlConnection($"Server = {form1.ServerBox.Text }; Database = { form1.DBBox.Text}; Trusted_Connection = True"));
dataTable = new DataTable();
sqlDa.Fill(dataTable);
dataGridView1.DataSource = dataTable;
foreach (DataGridViewColumn column in dataGridView1.Columns)
{
var item = (ToolStripMenuItem)contextMenuStrip1.Items.Add(column.HeaderText);
var item2 = comboBox2.Items.Add(column.HeaderText);
item.Tag = column.Name;
item.Checked = column.Visible;
item.CheckOnClick = true;
item.CheckedChanged += (obj, args) =>
{
var i = (ToolStripMenuItem)obj;
dataGridView1.Columns[(string)i.Tag].Visible = i.Checked;
};
}
}
答案 0 :(得分:1)
在填充之前,您需要清除Items
的{{1}}集合。可以简单地通过contextMenuStrip1
完成,但是为了防止应用程序中可能发生的句柄/内存泄漏,最好在删除菜单项后立即对其进行处理:
contextMenuStrip1.Items.Clear()
示例
这是一个工作示例,需要一个var items = contextMenuStrip1.Items.Cast<ToolStripItem>().ToList();
contextMenuStrip1.Items.Clear();
items.ForEach(x => x.Dispose());
,一个DataGridView
和一个ComboBox
。它将数据库表加载到ContextMenuStrip
中,并且当您从ComboBox
中选择索引时,它会将所选表的数据加载到ComboBox
中,如果右键单击该表的列标题DataGridView
,将显示DataGridView
,可让您设置列的可见性:
ContextMenuStrip