我有一个表单,用户可以向其中添加控件。当他们右键单击时,会弹出一个上下文菜单,其中有一个选项可以显示所右键单击的控件的属性。我遇到的问题是如何找出用户右键单击的控件,因为它可能是其中任何一个控件,并将该控件聚焦在表单上。有没有好的建议?我应该只使用鼠标事件的(object Sender)部分吗?
谢谢。
谢谢。
object Sender
,这是最直接的方法。虽然如果你想对特定控件类型进行操作,你需要进行强制转换。
更新:
如果你有一个良好的命名约定,或者至少对于那些需要ContextMenu操作的表单控件,你可以这样做:Controls
集合来附加到所有控件上。label1.MouseClick += new MouseEventHandler(control_RightMouseClick);
label2.MouseClick += new MouseEventHandler(control_RightMouseClick);
label3.MouseClick += new MouseEventHandler(control_RightMouseClick);
然后针对不同的控件执行不同的操作或显示不同的上下文菜单。
void control_RightMouseClick(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Right)
{
return;
}
if (sender.GetType().IsSubclassOf(typeof(Control)))
{
Control formControl = (Control)sender;
switch (formControl.Name)
{
case "label_1":
//do something
contextMenuStrip1.Show(formControl, e.Location);
break;
case "label_2":
//do something else
contextMenuStrip2.Show(formControl, e.Location);
break;
case "label_3":
//do something else
contextMenuStrip3.Show(formControl, e.Location);
break;
case "panel_1":
//do something else
break;
default:
//do something else or return or show default context menu
contextMenuStrip_default.Show(formControl, e.Location);
break;
}
}
return;
}
您可以使用以下方法检查触发事件的控件类型:
if (typeof(sender) == _control1.GetType())
{
// ...
}
或者为每个控件分配Tag
属性,并在事件处理程序中检查。 Tag
允许更多的自定义,但确实存在(取消)装箱的性能问题。 另一方面,检查类型可能会同样糟糕,但我没有任何依据支持这一点。