首先,要向窗体添加一个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("")) // 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[] == e.ClickedItem)
{
tb.SelectAll();
}else if (((ContextMenuStrip)sender).Items[] == e.ClickedItem)
{
Clipboard.SetDataObject(tb.SelectedText);
}else if (((ContextMenuStrip)sender).Items[] == e.ClickedItem)
{
IDataObject iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Text))
{
tb.Text += (String)iData.GetData(DataFormats.Text);
}
}else if (((ContextMenuStrip)sender).Items[] == e.ClickedItem)
{
tb.Text = "";
}
}

其实关于控制文本框的复制、粘贴、剪切等 WINFORM的TextBox都有对应的方法,可以不用控制剪贴板,控制剪贴板还要控制光标位置,比较麻烦点。

复制 TextBox.Copy();

粘贴 TextBox.Paste();

剪切 TextBox.Cut();

全选 TextBox.SelectAll();

Winform控件学习-TreeView - ContextMenuStrip的更多相关文章

  1. Winform控件学习-TreeView

    转自 http://www.cnblogs.com/zxlovenet/p/3589425.html      作者: 初行 TreeView控件用来显示信息的分级视图,如同Windows里的资源管理 ...

  2. Winform控件学习笔记【第二天】——常用控件

    背景:期末考试刚过就感冒了,嗓子火辣辣的,好难受.但是一想起要学习总结就打起精神来了,Winform控件网上也没有多少使用教程,大部分都是自己在网上零零散散的学的,大部分用的熟了,不总结会很容易忘得. ...

  3. Winform控件学习笔记【第六天】——TreeView

    TreeView控件用来显示信息的分级视图,如同Windows里的资源管理器的目录.TreeView控件中的各项信息都有一个与之相关的Node对象.TreeView显示Node对象的分层目录结构,每个 ...

  4. Winform控件学习笔记【第四天】——WebBrowser

    常用方法 Navigate(string urlString);//浏览urlString表示的网址 Navigate(System.Uri url);//浏览url表示的网址 Navigate(st ...

  5. WinForm控件学习笔记【第一天】——Control类

    感悟:明天就又是学校双选会的日子了.两年我都参与了学校的双选会的服务工作,现在该是双选会服务的我时候了.怎么样找到一份好的工作,或者说怎么样学习才能符合企业对人才的要求,我现在也是很迷茫.平时都是在看 ...

  6. Winform控件学习笔记【第五天】——ListView

    [第五天] 常用的基本属性: FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. GridLines:设置行和列之间是否显示网格线.( ...

  7. Winform控件学习笔记【第三天】——ListBox

    1. 属性事件列表: SelectionMode    组件中条目的选择类型,即多选(Multiple).单选(Single) Rows             列表框中显示总共多少行 Selecte ...

  8. WinForm控件TreeView 只部分节点显示 CheckBox

    WinForm控件TreeView 只部分节点显示  CheckBox 用过asp.net的应该知道,要在treeview中实现上述功能可以使用ShowCheckBox 属性指定那些节点显示check ...

  9. [工作札记]02: .Net Winform控件TreeView最简递归绑定方法

    前言:Treeview控件是我们在WinForm.WebForm开发中经常使用的控件,需要从数据库动态加载数据,然后递归绑定每一个节点:同样,递归的思路在其他程序中也经常运用,包括.Net MVC等. ...

随机推荐

  1. GitHub之创建

    O(∩_∩)O~ 爱“搞事”的我又创了一个Github账号,和当初加入博客园的初衷一样,为了广泛交流和学习而已.很久之前我就发现了有很多人都在使用GitHub,然而当时看不懂英文(绝大部分都是英文), ...

  2. VS2015环境下Crystal Reports(水晶报表)的安装使用

    1.首先下载Crystal Reports13对于Visual Studio 2015支持的2个文件. CRforVS_13_0_17 CRforVS_redist_install_64bit_13_ ...

  3. VHDL MOD和REM(转)

    mod(取模)and rem(取余) VHDL has mod and rem. They return the same value if both arguments are positive. ...

  4. wsus安装与部署——下

    转载请注明原出处 write by xiaoyang 一.            测试 1.         使用客户机或者在域环境下编辑GPO打开组策略 2.         配置自动更新 3.   ...

  5. 智捷公开课马上开始了-欢迎大家一起讨论学习-第一系列读《Swift开发指南(修订版) 》看Swift视频教程

    引用: 智捷课堂携手51CTO学院.图灵教育联合举办iOS线上培训就业班系列体验公开课. 分享移动开发.移动设计方向最新,最热,最抢眼技术热点以及设计经验.我们每周将最少举办一次公开课,同时会提前安排 ...

  6. 20141104--SQL连接查询,联合查询

    ---------------------------连接查询-------------------------------- --横向连接查询 --可以将子查询放在from之前,用来替换显示出来的信 ...

  7. UI1_UICollectionView

    // AppDelegate.m // UI1_UICollectionView // // Created by zhangxueming on 15/7/16. // Copyright (c) ...

  8. UI5_UINavigation传值

    // // AppDelegate.m // UI5_UINavigation传值 // // Created by zhangxueming on 15/7/7. // Copyright (c) ...

  9. Android实现Http协议案例

    在Android开发中,使用Http协议实现网络之间的通信是随处可见的,使用http方式主要采用2中请求方式即get和post两种方式. 一.使用get方式: HttpGet httpGet = ne ...

  10. linux IO子系统和文件系统读写流程

        本文转载自:http://blog.csdn.net/kidd_3/article/details/6909097 Technorati 标签: I/O 子系统 --------------- ...