C#鼠标右键单击并控制焦点

时间:2009-11-01 04:19:37

标签: c# controls focus contextmenu winforms

我有一个用户可以添加控件的表单,当他们右键单击它时会弹出一个上下文菜单,该菜单可以显示他们右键单击的控件的属性。我遇到的问题是试图决定如何找出用户右键点击的控件,因为它可以是任意数量的控件,然后将控件集中在表单上。有没有人有什么好建议?我应该只使用鼠标事件的(对象发件人)部分吗?

感谢。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

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

或者为每个控件分配Tag属性,并在事件处理程序中检查它。 Tag允许更多自定义,但确实存在(un)拳击的性能问题。然后,检查类型可能就像坏一样,但我没有任何东西支持它。