首先,要向窗体添加一个TreeView控件;
然后再添加一个ContextMenuStrip控件;
接下就要给TreeView添加一个MouseDown事件,代码如下:
Example 1
private void SchemaTreeView_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { Point clickPoint = new Point(e.X, e.Y); BaseTreeNode currentNode = (BaseTreeNode)this.GetNodeAt(clickPoint);// ((SchemaTreeView)sender).GetNodeAt(ClickPoint); if (currentNode != null) { if (SchemaAssemblyUtility.IsSchemaClass(currentNode.GetCurrentType())) { if (currentNode.Level.ToString().Equals("0")) // it is a top schema node which its level is zero { currentNode.ContextMenuStrip = contextMenuStrip_DeleteRootSchemaNode; } this.SelectedNode = currentNode; } } } private void contextMenuStrip_DeleteRootSchemaNode_Click(object sender, EventArgs e) { TreeNode currentNode = this.SelectedNode; if (currentNode != null) { currentNode.Nodes.Clear(); this.Nodes.Remove(currentNode); } else { MessageBox.Show("cannot delete a null node!"); } }
Example 2
http://blog.sina.com.cn/s/blog_685790700100ku5w.html
动态创建ContextMenuStrip并关联到控件的方法如下
void LoadMenustrip(Control Control) { ContextMenuStrip ms = new ContextMenuStrip(); ms.Items.Add("全选(Ctrl+A)"); ms.Items.Add("复制(Ctrl+C)"); ms.Items.Add("粘贴(Ctrl+V)"); ms.Items.Add("删除(Delete)"); ms.ItemClicked += new ToolStripItemClickedEventHandler(ms_ItemClicked); Control.ContextMenuStrip = ms; }
调用LoadMenustrip(TheControl)后就会在TheControl上关联一个ContextMenuStrip,同时还为这个ContextMenuStrip的ItemClicked绑定一个事件:ms_ItemClicked,也就是在点菜单上的某一项事引发的事件
ms_ItemClicked 事件处理,在这里sender获得的是这个ContextMenuStrip对象,e获得的是触发事件的Item参数,那么就有很多人在问如何获得触发这个事件的ContextMenuStrip相对应关联的控件呢?(也就是关联这个ContextMenuStrip的那个控件)
其实很简单,ContextMenuStrip有一个属性SourceControl,他就是和这个ContextMenuStrip相关联的那个控件了,类型自己转换一下就可以了。
另外,我没有找到任何获取触发这个事件的Item的索引和其他信息的方法,可以获取文本,但是很多时候我们不可能通过文本判断,因此,我用了直接比对对象的方法,
((ContextMenuStrip)sender).Items[1] == e.ClickedItem
也就是获取ContextMenuStrip本身的各个Item比对触发事件的Item。
除了获取关联控件,代码中的其他代码主要是处理剪贴板,和本文关系不大,不做介绍!
void ms_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { TextBox tb = ((TextBox)((ContextMenuStrip)sender).SourceControl); if (((ContextMenuStrip)sender).Items[0] == e.ClickedItem) { tb.SelectAll(); }else if (((ContextMenuStrip)sender).Items[1] == e.ClickedItem) { Clipboard.SetDataObject(tb.SelectedText); }else if (((ContextMenuStrip)sender).Items[2] == e.ClickedItem) { IDataObject iData = Clipboard.GetDataObject(); if (iData.GetDataPresent(DataFormats.Text)) { tb.Text += (String)iData.GetData(DataFormats.Text); } }else if (((ContextMenuStrip)sender).Items[3] == e.ClickedItem) { tb.Text = ""; } }
其实关于控制文本框的复制、粘贴、剪切等 WINFORM的TextBox都有对应的方法,可以不用控制剪贴板,控制剪贴板还要控制光标位置,比较麻烦点。
复制 TextBox.Copy();
粘贴 TextBox.Paste();
剪切 TextBox.Cut();
全选 TextBox.SelectAll();