Selcuk SZR Ответов: 2

Form1_keydown событие не работает правильно, когда дело доходит до разделителя и возврата ключей


Я пытался сделать свой простой калькулятор для работы с событиями клавиатуры. Пока все хорошо, кроме ключей.Разделитель и ключи.Возвращать. = кнопка работает нормально, и эти два события keydown также имеют одинаковые коды с кнопкой. он работает странно, например, скажем, я хочу суммировать 50 и 2, Когда я нажимаю return или numpad enter, чтобы увидеть результат, он просто продолжает добавлять "1"ко второй переменной(не имеет значения, какие это переменные, он всегда дублирует "1"), Если я нажимаю один раз, результат отображается как 21, Если я продолжаю нажимать return или numpad enter, он становится 211111111...

Другие события KeyDown работают нормально, интересно, есть ли у этих двух ключей особый способ работы...

Вот код события:

private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Separator||e.KeyCode==Keys.Return)
            {
                if (equal)
                {
                    sayi1 = sonuc;
                }
                else
                {
                    sayi2 = Convert.ToDouble(label1.Text);
                }
                if (topla)
                {
                    sonuc = sayi1 + sayi2;
                    label1.Text = (sonuc).ToString();
                }
                else if (cikar)
                {
                    sonuc = sayi1 - sayi2;
                    label1.Text = (sonuc).ToString();
                }
                else if (carp)
                {
                    sonuc = sayi1 * sayi2;
                    label1.Text = (sonuc).ToString();
                }
                else
                {
                    sonuc = sayi1 / sayi2;
                    label1.Text = sonuc.ToString();
                }
                sayi = sonuc.ToString();
                equal = true;
            }



Как работают другие части кода:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            KeyPreview = true;
        }

        public string sayi;//this variable is probably useless, i will work on it later
        public double sayi1, sayi2, sonuc;//var1,var2,result
        public bool topla, cikar, carp, bol, equal;//+,-,*,/







        private void button1_Click(object sender, EventArgs e)//1 button
        {
            if ((topla || cikar || carp || bol) && sayi == "")
                label1.Text = "";
            sayi += "1";
            label1.Text += "1";

        }

        private void button17_Click(object sender, EventArgs e)//c clear button
        {

            sayi = "";
            label1.Text = sayi;
            equal = false;
        }

        
        private void button14_Click(object sender, EventArgs e)//- process
        {
            sayi1 = double.Parse(label1.Text);
            sayi = "";
            equal = false;
            cikar = true;
            topla = false; carp = false; bol = false;
        }

        
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Separator||e.KeyCode==Keys.Return)
            {
                if (equal)
                {
                    sayi1 = sonuc;
                }
                else
                {
                    sayi2 = Convert.ToDouble(label1.Text);
                }
                if (topla)
                {
                    sonuc = sayi1 + sayi2;
                    label1.Text = (sonuc).ToString();
                }
                else if (cikar)
                {
                    sonuc = sayi1 - sayi2;
                    label1.Text = (sonuc).ToString();
                }
                else if (carp)
                {
                    sonuc = sayi1 * sayi2;
                    label1.Text = (sonuc).ToString();
                }
                else
                {
                    sonuc = sayi1 / sayi2;
                    label1.Text = sonuc.ToString();
                }
                sayi = sonuc.ToString();
                equal = true;
            }
            

            else if(e.KeyCode == Keys.D1 || e.KeyCode == Keys.NumPad1)
            {
                if ((topla || cikar || carp || bol) && sayi == "")
                    label1.Text = "";
                sayi += "1";
                label1.Text += "1";
            }

        
        private void button12_Click(object sender, EventArgs e)// = button
        {
            if (equal)
            {
                sayi1 = sonuc;
            }
            else
            {
                sayi2 = Convert.ToDouble(label1.Text);
            }
            if (topla)
            {
                sonuc = sayi1 + sayi2;
                label1.Text = (sonuc).ToString();
            }
            else if (cikar)
            {
                sonuc = sayi1 - sayi2;
                label1.Text = (sonuc).ToString();
            }
            else if (carp)
            {
                sonuc = sayi1 * sayi2;
                label1.Text = (sonuc).ToString();
            }
            else
            {
                sonuc = sayi1 / sayi2;
                label1.Text = sonuc.ToString();
            }
            sayi = sonuc.ToString();
            equal = true;
        }

        
    }


Что я уже пробовал:

Я кодировал эти два события отдельно, но это не имело никакого значения.

2 Ответов

Рейтинг:
13

OriginalGriff

Enter - это "специальный ключ", который активирует кнопку, а не передается через обработчик событий KeyDown по умолчанию.
Чтобы доказать это, добавьте точку останова в свой обработчик Form1_keyDown, и вы увидите, что я имею в виду - он никогда не попадает. На самом деле, если у вас есть элемент управления вводом, такой как текстовое поле или кнопка в вашей форме, события KeyDown даже не генерируются для формы, если свойство Form.KeyPreview не имеет значения true.
Чтобы "поймать" клавишу Enter в форме, вам лучше всего назначить кнопку " = " в качестве кнопки AcceptButton для формы, так как это приведет к тому, что ENTER нажмет на кнопку.


Selcuk SZR

Я установил = как Acceptbutton и удалил ключи.Введите коды, но он все равно показывает неправильный результат, он все еще просто продолжает добавлять "1" ко второй переменной :/

OriginalGriff

Что, по словам отладчика, происходит?

Selcuk SZR

Теперь я понимаю, в чем проблема: кнопка, которую я нажал последним на форме, становится синеватой (1 кнопка по умолчанию синевата, когда я запускаю приложение), и когда я нажимаю enter, приложение думает, что я нажимаю эту синеватую кнопку, и продолжает писать ее на этикетке. Но я не знаю, как я могу решить эту проблему

OriginalGriff

Ну, подход грубой силы и невежества состоял бы в том, чтобы установить фокус на кнопку"=", когда вы заканчиваете другие методы обработки ключей.

Selcuk SZR

Спасибо за помощь!

Рейтинг:
1

Selcuk SZR

Похоже, речь шла о методе фокусировки кнопок. Я установил все свойства TabIndex кнопок как False и добавил label1.Метод Focus () в каждом событии щелчка. Это решило проблему. Объявление " = "в качестве AcceptButton основной формы, вызванное TabIndex=false, не сработало для кнопки"=", поэтому мне пришлось снова использовать событие KeyDown для enter и numpad enter.