开发者

C# Mouse Right Click and Control Focus

开发者 https://www.devze.com 2022-12-10 09:37 出处:网络
I have a form which users can add controls to and when they right click it brings up a context menu which has an option to display the properties of the control they right clicked on.The problem I 开发

I have a form which users can add controls to and when they right click it brings up a context menu which has an option to display the properties of the control they right clicked on. The problem I 开发者_JAVA技巧am having is trying to decide how to find out what control the user right clicks on since it could be any number of them and then giving that control focus on the form. Does anyone have any good suggestions? Should I just use the (object Sender) portion of a mouse event?

Thanks.


My choice will be using object Sender, most straight forward. Though you need to do casting if you want to have operations on the specific control type.

UPDATE:

If you have a good naming convention or at least for those form controls which need ContextMenu operations, here's how you can do it:

Attaching mouse click event to specific controls or you can write something to attach to all controls by iteration through the form's Controls collection.

label1.MouseClick += new MouseEventHandler(control_RightMouseClick);
label2.MouseClick += new MouseEventHandler(control_RightMouseClick);
label3.MouseClick += new MouseEventHandler(control_RightMouseClick);

Then perform different operations or show different context menu for different controls

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;
}


You could either check the type of the control that triggers the event using:

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

or assigning the Tag property of each control, and checking that in the event handler. Tag allows more customization, but does have the performance issue of (un)boxing. Then again, checking the type might just be as bad, but I have nothing to back that up.

0

精彩评论

暂无评论...
验证码 换一张
取 消