如果我不创建“编辑->复制”菜单项并为其分配快捷键“CTRL+C”,那么我可以选择一个控件(RichTextBox、DataGridView 等)并点击“CTRL+C”然后控制本身将处理副本。我可以将文本复制出来,并将其粘贴到记事本等中。
现在,在我的整个表单中,我有很多控件。但是我有一个自定义控件,我想明确说明我为它处理复制功能。所以我在 Edit->Copy 中添加了 ShortcutKey CTRL+C,默认设置为 Enabled。
现在,我必须为该菜单项上的“单击”事件实现一个事件处理程序。如果我明确输入代码来处理副本,那么它可以工作:
public void menuEditCopy_Click(object sender, EventArgs e)
{
myCustomControl.Copy();
}
但是,现在 Copy 不适用于任何其他类型的控件。我的第一个倾向是找出具有焦点的控件类型,并为每个控件实现一组有限的复制代码:
public void menuEditCopy_Click(object sender, EventArgs e)
{
if (this.ActiveControl is MyCustomControl)
{
((MyCustomControl)this.ActiveControl).Copy();
}
else if (this.ActiveControl is RichTextBox)
{
((RichTextBox)this.ActiveControl).Copy();
}
}
ETC...
但是,我的控件被添加到 SplitContainer,调试显示 this.ActiveControl 设置为 splitcontainer 实例,而不是控件,即使我知道该控件已被选中。
所以我最后的想法是检查每个控件是否都有焦点:
public void menuEditCopy_Click(object sender, EventArgs e)
{
if (myCustomControl.Focused)
{
myCustomControl.Copy();
}
else if (richTextBox1.Focused)
{
richTextBox1.Copy();
}
}
如果可能的话,我想避免这种情况,它有很多控件,如果我添加一个新控件,我需要更新它。有没有更好的方法来做到这一点?
谢谢