none
Обработка события KeyPress RRS feed

  • Вопрос

  • Есть форма, на ней есть кнопка. Дважды кликая по кнопке, подписываемся на событие

    private void button_btnName_Click(object sender, EventArgs e)
            {
               some code
            }

    Далее, в дизайнере формы автоматом появляется следующий код

    this.button_btnName.Click += new System.EventHandler(this.button_btnName_Click);

    Теперь я хочу, чтобы эта же кнопка, нажималась не только мышкой, но и реагировала на нажатие с клавиатуры.

    private void button_btnName_Press(object sender, KeyEventArgs e)
            {
              some code
            }

    По аналогии с событием клика в дизайнере формы руками прописываю

    this.button_btnName.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.button_btnName_Press);
    Пишет Error: no overload method for button_btnName_Press matches delegate System.Windows.Forms.KeyPressEventHandler



Ответы

  • У вас же уже есть правильный код - обработка события KeyDown формы. Обрабатывая это событие - вы обрабатываете пользовательский ввод с клавиатуры. И для каждой кнопки вы обрабатываете событие Click - это пользовательский ввод с мышки.

    Все, никаких KyeDown и KeyPress для кнопок обрабатывать не надо.

    • Помечено в качестве ответа Andrey Langovoy 6 мая 2013 г. 14:24
  • Вы можете свой switch выделить в отдельную функцию. К примеру:

    void SomeFunc(Keys keys)
    {
        switch(keys)
        {
            ...
        {
    }

    И вызывать эту функцию:

    private void Form1_KeyDown(object sender, KeyEventArgs e) {

    SomeFunc(e.KeyCode);

    }

    private void button_Plus_Click(object sender, EventArgs e) {

    SomeFunc(Keys.Add); }

    Тем самым код у вас не будет повторяться.

    • Помечено в качестве ответа Andrey Langovoy 6 мая 2013 г. 14:25

Все ответы

  • У вас не правильно объявлен метод, который обрабатывает событие KeyPress:

    public delegate void KeyPressEventHandler(
    	Object sender,
    	KeyPressEventArgs e
    )
  • Ошибка не отображается теперь, но код не работает. Пишу калькулятор и хочу, обработать кнопку "+"

            private void Form1_KeyDown(object sender, KeyEventArgs e)
            {
                switch (e.KeyCode)
                {   case Keys.Add:
                        label_info.Text = label_main.Text + " + ";
                        label_main.Text = Calculate(op).ToString();
                        op = "+";
                        break;
        ...

    сама форма у меня подписана на событие

    this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);


    и таким образом все работает.

    Если же я делаю так, как описывал выше, т.е. 

    private void button_Plus_Press(object sender, System.Windows.Forms.KeyPressEventArgs e)
            {
                label_info.Text += label_main.Text + " + ";
                label_main.Text = Calculate(op).ToString();
                op = "+";
            }

    и руками прописываю в дизайнере 

    this.button_Plus.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.button_Plus_Press);
    то код не работает.

  • Чтобы у вас отработало событие KeyPress для кнопки - она (кнопка) должна иметь фокус. Но это не правильный подход. Правильнее обрабатывать событие формы (то же KeyDown).
  • Изменил на KeyDown

    this.button_Plus.KeyDown += new System.Windows.Forms.KeyEventHandler(this.button_Plus_Press);

    и обработчик

            private void button_Plus_Press(object sender, KeyEventArgs e)
            {
                label_info.Text += label_main.Text + " + ";
                label_main.Text = Calculate(op).ToString();
                op = "+";
            }
    Теперь вообще ничего не происходит. т.е код внутри метода не отрабатывает.

  • У вас же уже есть правильный код - обработка события KeyDown формы. Обрабатывая это событие - вы обрабатываете пользовательский ввод с клавиатуры. И для каждой кнопки вы обрабатываете событие Click - это пользовательский ввод с мышки.

    Все, никаких KyeDown и KeyPress для кнопок обрабатывать не надо.

    • Помечено в качестве ответа Andrey Langovoy 6 мая 2013 г. 14:24
  • Да, есть вот такой код, для каждой кнопки

            private void Form1_KeyDown(object sender, KeyEventArgs e)
            {
                switch (e.KeyCode)
                {
                    case Keys.Delete:
                        label_main.Text = "";
                        label_info.Text = "";
                        break;
                    case Keys.Back:
    
                        break;
                    case Keys.Decimal:
                        label_main.Text = label_main.Text + ",";
                        break;
                    case Keys.D0:
                    case Keys.NumPad0:
                        label_main.Text = label_main.Text + "0";
                        break;
                    case Keys.D1:
                    case Keys.NumPad1:
                        clear = ClearScr(clear);
                        if (label_main.Text.Length < 28)
                            label_main.Text = label_main.Text + "1";
                        else
                            SystemSounds.Beep.Play();
                        break;
                    case Keys.D2:
                    case Keys.NumPad2:
                        clear = ClearScr(clear);
                        if (label_main.Text.Length < 28)
                            label_main.Text = label_main.Text + "2";
                        else
                            SystemSounds.Beep.Play();
                        break;
                    case Keys.D3:
                    case Keys.NumPad3:
                        clear = ClearScr(clear);
                        if (label_main.Text.Length < 28)
                            label_main.Text = label_main.Text + "3";
                        else
                            SystemSounds.Beep.Play();
                        break;
                    case Keys.D4:
                    case Keys.NumPad4:
                        clear = ClearScr(clear);
                        if (label_main.Text.Length < 28)
                            label_main.Text = label_main.Text + "4";
                        else
                            SystemSounds.Beep.Play();
                        break;
                    case Keys.D5:
                    case Keys.NumPad5:
                        clear = ClearScr(clear);
                        if (label_main.Text.Length < 28)
                            label_main.Text = label_main.Text + "5";
                        else
                            SystemSounds.Beep.Play();
                        break;
                    case Keys.D6:
                    case Keys.NumPad6:
                        clear = ClearScr(clear);
                        if (label_main.Text.Length < 28)
                            label_main.Text = label_main.Text + "6";
                        else
                            SystemSounds.Beep.Play();
                        break;
                    case Keys.D7:
                    case Keys.NumPad7:
                        clear = ClearScr(clear);
                        if (label_main.Text.Length < 28)
                            label_main.Text = label_main.Text + "7";
                        else
                            SystemSounds.Beep.Play();
                        break;
                    case Keys.D8:
                    case Keys.NumPad8:
                        clear = ClearScr(clear);
                        if (label_main.Text.Length < 28)
                            label_main.Text = label_main.Text + "8";
                        else
                            SystemSounds.Beep.Play();
                        break;
                    case Keys.D9:
                    case Keys.NumPad9:
                        clear = ClearScr(clear);
                        if (label_main.Text.Length < 28)
                            label_main.Text = label_main.Text + "9";
                        else
                            SystemSounds.Beep.Play();
                        break;
                    case Keys.Add:
                        label_info.Text = label_main.Text + " + ";
                        label_main.Text = Calculate(op).ToString();
                        op = "+";
                        break;
                    case Keys.Subtract:
                        label_info.Text = label_main.Text + "-";
                        break;
                    case Keys.Multiply:
                        label_info.Text = label_main.Text + "*";
                        break;
                    case Keys.Divide:
                        label_info.Text = label_main.Text + "/";
                        break;
                }
            }
    Просто думал можно отдельно обработать не числовые кнопки 
      private void button_Plus_Press(object sender, KeyEventArgs e)
            {
                label_info.Text += label_main.Text + " + ";
                label_main.Text = Calculate(op).ToString();
                op = "+";
            }

    вот таким вот образом.

    Т.е. получается все кнопки нужно обрабатывать только в рамках swith case !? Много повторяющегося кода получается :( Наверное нужно делать Extract Method...но как я понимаю - это уже отдельный вопрос )

    Спасибо.

  • Вы можете свой switch выделить в отдельную функцию. К примеру:

    void SomeFunc(Keys keys)
    {
        switch(keys)
        {
            ...
        {
    }

    И вызывать эту функцию:

    private void Form1_KeyDown(object sender, KeyEventArgs e) {

    SomeFunc(e.KeyCode);

    }

    private void button_Plus_Click(object sender, EventArgs e) {

    SomeFunc(Keys.Add); }

    Тем самым код у вас не будет повторяться.

    • Помечено в качестве ответа Andrey Langovoy 6 мая 2013 г. 14:25
  • Спасибо попробую.