標籤:des winform style blog http color os for ar
首先,要向表單添加一個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