很少做WINFORM的项目
今天偶有触及,遇到一个使用ContextMenuStrip的小问题
研究得不算深,不过也解决一些网上经常有人问的小问题。
首先ContextMenuStrip和ContextMenu的区别是版本不同,Vs05中ContextMenuStrip替代了ContextMenu的,并且更强大,但是依然保留了ContextMenu,所以会看到两个类型同时出现,不必茫然,就用ContextMenuStrip吧。
动态创建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 += newToolStripItemClickedEventHandler(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, ToolStripItemClickedEventArgse)
{
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();
如果还是想直接通过剪贴板,那么控制光标起始位置可以使用 TextBox.SelectionStart 属性完成。
研究得还不是很全面,其他方面的内容,等学习到再记录