c # как получить keydown и нажатие кнопки, чтобы сделать то же самое? - PullRequest
2 голосов
/ 07 июня 2010

Я новичок в C #. Я учусь делать калькулятор так же, как калькулятор MS Windows. Кнопки работают, когда я нажимаю на него, но я хочу, чтобы цифровая клавиатура тоже работала. Предположим, что пользователь вводит «0», оно должно быть таким же, как если бы он нажал кнопку 0 на моем графическом интерфейсе. вот мое событие нажатия кнопки для 0.

private void button0_Click(object sender, EventArgs e)
        {
            checkifequa();
            textBox1.Text = textBox1.Text + "0";
        }

как мне заставить работать keydown?

EDIT

вот полный источник. Это написал какой-то парень на YouTube, я только изменяю и пытаюсь учиться. Пожалуйста, укажите на любые ошибки, а также предложите лучшие способы.

<br>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;</p>

<p>namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        bool plus = false;
        bool minus = false;
        bool into = false;
        bool divd = false;
        bool equa = false;
        public Form1()
        {
            InitializeComponent();
        }</p>

    private void button0_Click(object sender, EventArgs e)
    {
        checkifequa();
        textBox1.Text = textBox1.Text + "0";
    }

    private void button1_Click(object sender, EventArgs e)
    {
        checkifequa();

        textBox1.Text = textBox1.Text + "1";
    }

    private void checkifequa()
    {
        if (equa)
            textBox1.Text = "";
        equa = false;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        checkifequa();
        textBox1.Text = textBox1.Text + "2";
    }

    private void button3_Click(object sender, EventArgs e)
    {
        checkifequa();
        textBox1.Text = textBox1.Text + "3";
    }

    private void button4_Click(object sender, EventArgs e)
    {
        checkifequa();
        textBox1.Text = textBox1.Text + "4";
    }

    private void button5_Click(object sender, EventArgs e)
    {
        checkifequa();
        textBox1.Text = textBox1.Text + "5";
    }

    private void button6_Click(object sender, EventArgs e)
    {
        checkifequa();
        textBox1.Text = textBox1.Text + "6";
    }

    private void button7_Click(object sender, EventArgs e)
    {
        checkifequa();
        textBox1.Text = textBox1.Text + "7";
    }

    private void button8_Click(object sender, EventArgs e)
    {
        checkifequa();
        textBox1.Text = textBox1.Text + "8";
    }

    private void button9_Click(object sender, EventArgs e)
    {
        checkifequa();
        textBox1.Text = textBox1.Text + "9";
    }

    private void button11_Click(object sender, EventArgs e)
    {
        checkifequa();
        if(textBox1.Text.Contains("."))
        {
            return;
        }
        else
        {
        textBox1.Text=textBox1.Text+".";
        }

    }

    private void plusminus_Click(object sender, EventArgs e)
    {
        if (textBox1.Text.Contains("-"))
        {
            textBox1.Text = textBox1.Text.Remove(0, 1);
        }
        else
        {
            textBox1.Text = "-" + textBox1.Text;
        }
    }

    private void plus_Click(object sender, EventArgs e)
    {
        if (textBox1.Text == "")
        {
            return;
        }
        else
        { 
            plus = true;
            textBox1.Tag = textBox1.Text;
            textBox1.Text = "";
        }

    }

    private void equal_Click(object sender, EventArgs e)
    {
        equa = true;

        if (plus)
        {
            decimal dec = Convert.ToDecimal(textBox1.Tag) + Convert.ToDecimal(textBox1.Text);
            textBox1.Text = dec.ToString();

        }
        if (minus)
        {
            decimal dec = Convert.ToDecimal(textBox1.Tag) - Convert.ToDecimal(textBox1.Text);
            textBox1.Text = dec.ToString();

        }
        if (into)
        {
            decimal dec = Convert.ToDecimal(textBox1.Tag) * Convert.ToDecimal(textBox1.Text);
            textBox1.Text = dec.ToString();

        }
        if (divd)
        {
            decimal dec = Convert.ToDecimal(textBox1.Tag) / Convert.ToDecimal(textBox1.Text);
            textBox1.Text = dec.ToString();

        }
    }

    private void substract_Click(object sender, EventArgs e)
    {

        if (minus)
            if (textBox1.Text == "")
            {
                return;
            }
            else
            {
                minus = true;
                textBox1.Tag = textBox1.Text;
                textBox1.Text = "";
            }
    }

    private void multiply_Click(object sender, EventArgs e)
    {
        if (textBox1.Text == "")
        {
            return;
        }
        else
        {
            into = true;
            textBox1.Tag = textBox1.Text;
            textBox1.Text = "";
        }
    }

    private void divide_Click(object sender, EventArgs e)
    {
        if (textBox1.Text == "")
        {
            return;
        }
        else
        {
            divd = true;
            textBox1.Tag = textBox1.Text;
            textBox1.Text = "";
        }
    }

    private void clear_Click(object sender, EventArgs e)
    {
        plus = minus = into = divd = equa = false;
        textBox1.Text = "";
        textBox1.Tag = "";

    }




    void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar >= 48 && e.KeyChar <= 57)
        {
            switch (e.KeyChar)
            {
                case (char)48:
                    button0.PerformClick();
                    break;

                case (char)49:
                    button1.PerformClick();
                    break;
                case (char)50:
                    button2.PerformClick();
                    break;
                case (char)51:
                    button3.PerformClick();
                    break;
                case (char)52:
                    button4.PerformClick();
                    break;
                case (char)53:
                    button5.PerformClick();
                    break;
                case (char)54:
                    button6.PerformClick();
                    break;
                case (char)55:
                    button7.PerformClick();
                    break;
                case (char)56:
                    button8.PerformClick();
                    break;
                case (char)57:
                    button9.PerformClick();
                    break;

            }

        }  
    }


}

}

Ответы [ 4 ]

1 голос
/ 07 июня 2010

Вы можете добавить один и тот же обработчик событий для всех кнопок с одинаковым кодом / функциональностью, например:

buttonZero.Click += numberButton_Click;
buttonOne.Click += numberButton_Click;
...

buttonPlus.Click += numberButton_Click;
buttonMinus.Click += numberButton_Click;
...

private void numberButton_Click(object sender, EventArgs e)
{
   checkifequa();
   var numButton = sender as Button;
   if(numButton != null)
      textBox1.Text = textBox1.Text + numButton.Text; // supposing your num buttons have only the number as text (otherwise you could use the Tag property of buttons)
}

private void operatorButton_Click(object sender, EventArgs e)
{
   checkifequa();
   var operatorButton = sender as Button;
   if(operatorButton != null)
      textBox1.Text = textBox1.Text + operatorButton .Text; // supposing your operator buttons have only the operator as text (otherwise you could use the Tag property of button)
}
// ...

Для событий клавиатуры, как предложено cre-johnny07: Вы можете обработать событие previewKeyDown или KeyDown и сделать что-то вроде:

private void parentControl_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.NumPad0)
        this.buttonZero.PerformClick();
    else if (e.KeyCode == Keys.NumPad1)
        this.buttonOne.PerformClick();
    // and so on... 
}

Таким образом, вы также получите приятный эффект нажатия кнопки при наборе текста на numPad ...

1 голос
/ 07 июня 2010

проверьте событие PreviewKeyDown окна и сделайте что-нибудь подобное

if (e.KeyCode == Keys.NumPad0 || e.KeyCode == Keys.NumPad1)
{
   // Do what you want to do.
}
0 голосов
/ 07 июня 2010

Я бы взял «бизнес-логику» из обработчика нажатия / нажатия клавиш.Кроме того, я хотел бы хранить данные в частных свойствах вместо тега TextBox.Я пропустил проверочный код, который у вас обычно был бы.

private string FirstNumber { get; set; }
private string SecondNumber { get; set; }
private bool IsSecondNumberBeingEntered { get; set; }

private Operation SelectedOperation { get; set;}
private enum Operation
{
    Add,
    Subtract,
    Multiply,
    Divide
}

private void button0_Click(object sender, EventArgs e)
{
    this.AddNumber(0);
    textBox1.Text = textBox1.Text + "0";
}

// Etc.

// In PreviewKeyDown:
if (e.KeyCode == Keys.NumPad0 || e.KeyCode == Keys.D0)
{
    this.AddNumber(0);
}

private void AddNumber(int number)
{
    if (IsSecondNumberBeingEntered)
    {
        SecondNumber += number.ToString();
    }
    else
    {
        FirstNumber += number.ToString();
    }
}

private decimal Calculate()
{
    switch (SelectedOperation)
    {
        case Operation.Add:
            return Convert.ToDecimal(FirstNumber) + Convert.ToDecimal(SecondNumber);
        case Operation.Subtract:
            return Convert.ToDecimal(FirstNumber) - Convert.ToDecimal(SecondNumber);
        // etc.
        default:
            throw new ArgumentOutOfRangeException();
    }
}
0 голосов
/ 07 июня 2010

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

Исходя из моего опыта, структура программы становится намного более аккуратной.

...