【问题标题】:C# Mouse Right Click and Control FocusC# 鼠标右键单击和控制焦点
【发布时间】:2010-12-11 23:58:51
【问题描述】:

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

谢谢。

【问题讨论】:

  • 如果您接受答案,您是否忘记接受答案,然后您将获得+2 分和作者+15

标签: c# controls focus contextmenu winforms


【解决方案1】:

我的选择是使用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 is Label 然后启用焦点,它会将焦点放在所有标签上还是只点击一个?我想我主要担心的是有多个相同类型的控件,当它们单击时无法区分它们。这有意义吗?
  • @Nathan:我已经更新了我的答案以解决您的 cmets。请参考。
  • @Nathan:darkassassin93 使用Tag 的想法可以用来代替控件名称。但就像他也提到的那样,您需要强制转换标签对象。
【解决方案2】:

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

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

或分配每个控件的Tag 属性,并在事件处理程序中检查它。 Tag 允许更多自定义,但确实存在(取消)装箱的性能问题。再说一次,检查类型可能同样糟糕,但我没有什么可以支持的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    相关资源
    最近更新 更多