How to disable navigation on WinForm with arrows in C#?
Asked Answered
S

4

15

I need to disable changing focus with arrows on form. Is there an easy way how to do it?

Thank you

Sharma answered 23/8, 2009 at 10:23 Comment(0)
M
18

Something along the lines of:

    private void Form1_Load(object sender, EventArgs e)
    {
        foreach (Control control in this.Controls)
        {
            control.PreviewKeyDown += new PreviewKeyDownEventHandler(control_PreviewKeyDown);
        }
    }

    void control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right)
        {
            e.IsInputKey = true;
        }
    }
Melanosis answered 23/8, 2009 at 11:13 Comment(3)
Works perfect. Thank you! Just short note for other people: foreach (Control control in this.Controls) does not contain all controls - you may have containers (e.g., system.windows.forms.panel) on form.Sharma
Wouldn't have thought of that, but that seems to completely work. (My goal was to conditionally disable Enter, but same idea.) Thanks!Electrophysiology
Ah thank you! The key was PreviewKeyDown event instead of KeyDown event. I was trying to solve the issue under KeyDown event but once I set space key as input key it solved. Now my buttons don't get clicked with space :)Vestment
S
5

I've ended up with the code below which set the feature to EVERY control on form:

(The code is based on the one from andynormancx)



private void Form1_Load(object sender, EventArgs e)
{
    SetFeatureToAllControls(this.Controls);    
}

private void SetFeatureToAllControls(Control.ControlCollection cc)
{
    if (cc != null)
    {
        foreach (Control control in cc)
        {
            control.PreviewKeyDown += new PreviewKeyDownEventHandler(control_PreviewKeyDown);
            SetFeatureToAllControls(control.Controls);
        }
    }
}

void control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right)
    {
        e.IsInputKey = true;
    }
}
Sharma answered 23/8, 2009 at 12:0 Comment(0)
S
1

You should set KeyPreview to true on the form. Handle the KeyDown/KeyUp/KeyPress event and set the e.Handled in the eventhandler to true for the keys you want to be ignored.

Speaker answered 23/8, 2009 at 10:44 Comment(4)
That approach doesn't seems to work, there is no e.Handled on the PreviewKeyDownEventArgsMelanosis
e.Handled exists but in method: private void Form1_KeyUp(object sender, KeyEventArgs e), KeyDown etc. I have problems with this approach too. I'll try it on clean project.Sharma
Yes it exists in the KeyDown event, but setting it doesn't help, the navigation has already happened by that point.Melanosis
I wasn't sure when the navigation was made. The advice below works great.Sharma
E
1

I tried this aproach, where the form handles the preview event once. It generates less code than the other options.

Just add this method to the PreviewKeyDown event of your form, and set the KeyPreview property to true.

private void form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Up:
        case Keys.Down:
        case Keys.Left:
        case Keys.Right:
            e.IsInputKey = true;
            break;
        default:
            break;
    }
}
Effy answered 31/1, 2012 at 14:52 Comment(2)
Hi carlos. I wanted to use your shorter version, but when I tested it, it did not do what it should unfortunately.. (and I did remember to set Form.KeyPreview=true of course). Only when I added the foreach() in Form_Load, then the behavior changed.. Have you tested it?Maura
this does not work if the form contains more than one level of container hierarchies.Bordure

© 2022 - 2024 — McMap. All rights reserved.