问题描述
我的项目有一个包含 52 列的 DataGridView,其中一些列不可见。但我希望用户可以轻松地看到它们。所以我添加了一个按钮,如下图所示。这使五列可见。
但是滚动时的问题,这个按钮在表单上保持静态。我希望此按钮锚定到特定的列标题。可移动列标题。
所以我尝试将 DataGridView 和 Button 控件放在与孩子相同的面板上。这是有效的,但面板滚动的功能不如 DataGridView 的滚动。例如在面板滚动冻结列不起作用。
有什么办法可以解决这个问题。我希望用户像 Excel 一样轻松地使列可见或不可见。没有必要使用按钮。如果还有其他选择,我很感兴趣。
解决方法
我将举例说明如何使用上下文菜单来显示和隐藏 DataGridView 列。
向表单添加菜单:
ContextMenuStrip columnMenu;
像这样创建菜单。每列都有一个带有复选框的菜单项。
当然,你也可以在设计器中手动创建和填写。
private void Form1_Load(object sender,EventArgs e)
{
columnMenu = new ContextMenuStrip();
foreach (DataGridViewColumn column in dataGridView.Columns)
{
var item = new ToolStripMenuItem();
item.Text = column.Name;
item.CheckOnClick = true;
item.Checked = true;
item.Click += Item_Click;
columnMenu.Items.Add(item);
}
}
选择菜单项时,显示或隐藏列。
private void Item_Click(object sender,EventArgs e)
{
var item = (ToolStripMenuItem)sender;
dataGridView.Columns[item.Text].Visible = item.Checked;
}
在事件上订阅 DataGridView:
dataGridView.ColumnHeaderMouseClick += DataGridView_ColumnHeaderMouseClick;
在此事件处理程序中,显示菜单。
private void DataGridView_ColumnHeaderMouseClick(object sender,DataGridViewCellMouseEventArgs e)
{
columnMenu.Show(MousePosition);
}