给DataGridView或TreeView的添加右键菜单
所属栏目:
winform
时间:2013-08-07 08:26
作者:狼子
一般实现右键菜单,只需要在窗体上加一个ContextMenuStrip控件,再设置需要右键菜单的控件的ContextMenuStrip属性,就可以自动实现右键菜单了,鼠标在哪儿点,菜单在哪儿显示
就是,如果是在DataGridView上点右键,出来的菜单如果是和行有关系的,比如修改当前行的数据、删除当前行。。。那就不可以用这个方法了
因为只要设置了DataGridView的ContextMenuStrip属性,DataGridView的CellMouseDown和CellMouseClick事件就只响应左键,不响应右键,导致不能通过CellMouseDown或CellMouseClick事件获取鼠标右击时的行号
当右键出来的菜单和DataGridView的行有关时,同样要添加ContextMenuStrip控件,但不需要设置ContextMenuStrip属性,添加CellMouseClick事件,代码如下:
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Right && e.RowIndex > -1)
{
dataGridView1.ClearSelection();
dataGridView1.Rows[e.RowIndex].Selected = true;
contextMenuStrip1.Show(MousePosition.X, MousePosition.Y);
}
}
即:先清空当前的选中行,再获取当前行号,设置当前行的是选中状态,在鼠标点击的位置显示菜单
-----------------------------------------------
给TreeView控件添加右键菜单时,是在NodeMouseClick事件中判断节点,所以没有这种情况,可以直接设置ContextMenuStrip属性添加右键菜单
就是,我还是喜欢不设置ContextMenuStrip属性,然后在NodeMouseClick事件里在鼠标点击的地方显示菜单,因为这样可以避免在TreeView空白的地方点右键时,没有节点被选中,还是一样显示菜单的问题,有时候TreeView会很高,就是节点只有几个,下面会有比较大的地方是空白,在那一片空白里,我不想显示右键菜单,如果是通过设置ContextMenuStrip属性的,避免不开这个
所以我还是选择不设置ContextMenuStrip属性,自己在NodeMouseClick事件里设置当前节点是选中节点,然后显示菜单,代码如下:
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
treeView1.SelectedNode = e.Node;
contextMenuStrip1.Show(MousePosition.X, MousePosition.Y);
}
}