C# 如何实现鼠标右键点击和控件焦点控制?

3
我有一个表单,用户可以向其中添加控件。当他们右键单击时,会弹出一个上下文菜单,其中有一个选项可以显示所右键单击的控件的属性。我遇到的问题是如何找出用户右键单击的控件,因为它可能是其中任何一个控件,并将该控件聚焦在表单上。有没有好的建议?我应该只使用鼠标事件的(object Sender)部分吗?
谢谢。

你是否忘记接受答案了?如果你接受了答案,那么你将获得+2分和作者+15分。 - Anirudha Gupta
2个回答

5
我的选择是使用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;
}

如果我的表单上有3个标签,并且我使用对象Sender是Label,然后启用焦点,它会将焦点放在所有标签上还是只有被点击的那一个?我想我的主要担忧是当有多个相同类型的控件并且无法区分它们被点击时。这样说您能理解吗? - Nathan
@Nathan:我已更新了我的答案以回应您的评论,请参考。 - o.k.w
@Nathan:darkassassin93使用“Tag”作为控件名称的替代方法是可行的。但正如他所提到的,您需要将标记对象转换类型。 - o.k.w

0

您可以使用以下方法检查触发事件的控件类型:

if (typeof(sender) == _control1.GetType())
{
     // ...
}

或者为每个控件分配Tag属性,并在事件处理程序中检查。 Tag允许更多的自定义,但确实存在(取消)装箱的性能问题。 另一方面,检查类型可能会同样糟糕,但我没有任何依据支持这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接