我只需要处理特定选定表的列名

时间:2019-07-08 10:22:01

标签: c# .net winforms

当我从ComboBox中选择一个表时,将获得该表中存在的每一列(并有一个在我检查时将其隐藏的选项)。

enter image description here

当我从“组合框”中选择下一个表时,我将获得新表列以及第一个表中的前一个表列。

enter image description here

如何解决此问题并仅保存选定的表列?

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;
        };
    }            
}

1 个答案:

答案 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