Если у вас есть столбцы в DataGridView
, вам не нужно загружать их снова с сервера SQL, и, как уже показано в другом ответе, вы можете получить имена столбцов из DataGridView
.
Чтобы добавить столбцы к CheckedListBox
, я предпочитаю использовать DataSource
, DisplayMember
и ValueMember
, чтобы показать столбец HeaderText
в CheckedListBox
, при этом имея доступ к их именам, чтобы иметь возможность их найти в DataGridView
.
Тогда я бы установил начальное состояние проверки элементов на основе видимости их соответствующего столбца.
Затем я обработаю событие ItemCheck
и найду имя столбца на основе отмеченного элемента и установлю видимость столбца на основе нового состояния проверки:
//Add the columns to checked list box
var columns = dataGridView1.Columns.Cast<DataGridViewColumn>()
.Select(x => new { x.Name, x.HeaderText }).ToList();
checkedListBox1.DataSource = columns;
checkedListBox1.ValueMember = "Name";
checkedListBox1.DisplayMember = "HeaderText";
//Set initial check state based on columns visibility
for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
dynamic item = checkedListBox1.Items[i];
checkedListBox1.SetItemChecked(i, dataGridView1.Columns[(string)item.Name].Visible);
}
//Hanlde ItemCheck event
checkedListBox1.ItemCheck += (obj, args) =>
{
dynamic item = checkedListBox1.Items[args.Index];
var visible = args.NewValue == CheckState.Checked ? true : false;
dataGridView1.Columns[(string)item.Name].Visible = visible;
};
![enter image description here](https://i.stack.imgur.com/l2BE3.png)
На всякий случай, если вы заинтересованы в этом, используя ContextMenuStrip
:
//Add the columns to context menu strip
foreach (DataGridViewColumn c in dataGridView1.Columns)
{
var item = (ToolStripMenuItem)contextMenuStrip1.Items.Add(c.HeaderText);
item.Tag = c.Name;
item.Checked = c.Visible;
item.CheckOnClick = true;
//Hanlde CheckStateChanged event of context menu strip items
item.CheckStateChanged += (obj, args) =>
{
var i = (ToolStripMenuItem)obj;
dataGridView1.Columns[(string)i.Tag].Visible = i.Checked;
};
}
//Show context menu strip on right click on data grid veiw header
dataGridView1.CellMouseClick += (obj, args) =>
{
if (args.RowIndex == -1 && args.Button == MouseButtons.Right)
contextMenuStrip1.Show(Cursor.Position);
};
![enter image description here](https://i.stack.imgur.com/HJsvt.png)