Winform控件学习-TreeView - ContextMenuStrip

首先,要向窗体添加一个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();

Winform控件学习-TreeView - ContextMenuStrip

上一篇:让webapi支持CORS,可以跨域访问


下一篇:Windows 8.1/Office 2013一键激活工具 KMS最新版v7.8.6