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();

你可能感兴趣的:(contextMenu)