tags:

views:

334

answers:

3

Hello,

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

Thank you

A: 

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.

Henri
That approach doesn't seems to work, there is no e.Handled on the PreviewKeyDownEventArgs
andynormancx
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.
MartyIX
Yes it exists in the KeyDown event, but setting it doesn't help, the navigation has already happened by that point.
andynormancx
I wasn't sure when the navigation was made. The advice below works great.
MartyIX
+1  A: 

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;
        }
    }
andynormancx
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.
MartyIX
A: 

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