Вы должны войти, чтобы создавать сообщения и темы.

Передача KeyEventHandler в дочернюю форму

Всем привет. 
Подскажите такую штуку...
В основной форме(MainForm) есть панель. В ней открывается дочерняя форма(ChildForm) со своими событиями(события повешаны на таймер и на PictureBox, а также присутствуют события обработки нажатия и отпускания кнопки KeyUp и KeyDown).
При клике на кнопку, что расположена на  MainForm - открывается ChildForm и располагается в панели. Все обработчики событий работают, кроме KeyUp и KeyDown. Как можно их активировать?
Возможно мой подход совсем не правильный, но я делал так:

ChildForm cf = new ChildForm()
{
Dock = DockStile.Fill,
TopLevel = false,
Autoscroll = true
};
PanelMainForm.Controls.Add(cf);
cf.Show();

И все бы хорошо, но события KeyUp и KeyDown не срабатывают. Теоретически я понимаю, что эти события нужно перехватывать в MainForm и транслировать их в события ChildForm, но никак не могу понять как это сделать, или в какую сторону копать. Подскажите кто чем может, или направьте в нужном направлении пожалуйста, возможно мой подход в корне не верен и нужно всю логику контролов ChildForm создавать в основном коде а обработчики событий создавать динамически. Заранее Благодарен.

ПриветAlex, 
у вас включено свойство на Форме СкопированоKeyPreview = true;  ?

Оно должно быть включено в дочерней, или в главной форме?

В основной форме, где у Вас обработчики (KeyUp и KeyDown)

Обработчики у меня в дочерней форме.

Значит пробуйте в дочерней форме, или в коде в лоад формы прописать KeyPreview = true;
или на самой форме, зайти в свойства и найти KeyPreview и поставить у нее true

Спасибо большое. Копнул в этом направлении и выяснил, что я пытаюсь обрабатывать стрелки и как оказалось по умолчанию стрелками переключаются фокусы контролов на форме, не смотря на KeyPreview = true. Для того чтоб это обойти в событии PreviewKeyDown менял свойство IsInputKey = true.
Может кому пригодится, шаги следующие...
1)Создать метод для PreviewKeyDown

//Этот метод находится в Главной форме
private void control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Down:
                case Keys.Up:
                case Keys.Left:
                case Keys.Right:
                    e.IsInputKey = true;
                    break;
                default:
                    break;
            }
        }

 2)В обработке на Главной форме, для показа дочерней формы делаю вызов следующим образом
 

private void Button_MouseClick(object sender, MouseEventArgs e)
        {
            ChildForm cf = new ChildForm()
            {
                Dock = DockStyle.Fill,
                TopLevel = false,
                AutoScroll = true,
                KeyPreview = true //На всякий случай добавил и это свойство
            };
            cf.PreviewKeyDown += control_PreviewKeyDown;
            pnlMain.Controls.Add(cf);
            cf.Show();
            cf.Focus();
        }

 Вся остальная логика поведения дочерней форме осталась в дочерней форме.

Еще раз всем спасибо за направление.

 

Вы сделали вызов по нажатию MouseClick.
Можно ещё сделать, что бы не только мышкой, а на кнопке событие Click, но и при нажатии на кнопку Enter на клавиатуре, тоже работало

можно в инициализацию код закинуть

KeyPreview = true;
            KeyDown += (a, e) => { if (e.KeyValue == (char)Keys.Enter) { button1_Click(button1, null); } };