首先,要向窗体添加一个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. Asp.Net复习篇之Asp.Net生命周期与Asp.Net页的生命周期

    Asp.Net生命周期与Asp.Net页的生命周期是一个比较重要的话题,有时可能似乎知道一些,但又说不出个所以然,而且时常把这两个概念混淆.现在也是该好好理清思路,把这两个概念搞懂. Asp.Net生 ...

  2. 数据校验validator 与 DWZ

    在做系统时经常会用到数据校验,数据校验可以自己写,也可以用现在成的,现在记录下两种类库使用方法, <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 ...

  3. Javascript之图片上传预览

    使用Javascript之图片上传预览,我们无需上传到服务器中,兼容所有浏览器. 关键方法是使用微软库filter:progid:DXImageTransform.Microsoft.AlphaIma ...

  4. 北大ACM(POJ1007-DNA Sorting)

    Question:http://poj.org/problem?id=1007 问题点:逆序数及快排. Memory: 248K Time: 0MS Language: C++ Result: Acc ...

  5. OC3_协议关键字

    // // Student.h // OC3_协议关键字 // // Created by zhangxueming on 15/6/24. // Copyright (c) 2015年 zhangx ...

  6. JAVA多线程通信

    JAVA多线程通信 package com.frank.thread; /** * author:pengyan * date:Jun 16, 2011 * file:ProducerAndCusto ...

  7. VC和VS系列(2005)编译器对双精度浮点溢出的处理

    作者:风影残烛 在还原代码的过程中.目前程序是采用VS2005(以上版本)写的. 我使用的是vc6.0,结果.在运算的时候.发现编译器对 // FpuTlxTest.cpp : 定义控制台应用程序的入 ...

  8. FPGA/CPLD设计思想与技巧

    本文讨论的四种常用FPGA/CPLD设计思想与技巧:乒乓操作.串并转换.流水线操作.数据接口同步化,都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工作 ...

  9. 将json转为复杂url参数

    //json转url参数 var parseParam = function(param, key) { var paramStr = ""; if (param instance ...

  10. Mysql 的MYISAM引擎拷贝出现异常——Incorrect information in file 'xxx.frm'

    MYISAM引擎有三个文件 .FRM    存储表结构 .MYD    存储数据 .MYI   存储索引 当复制表时,将这三个文件同时复制到指定目录下. 异常处理: 1. Incorrect info ...