【问题标题】:c#: Using enter for KeyDown does not workc#:对 KeyDown 使用 enter 不起作用
【发布时间】:2020-07-17 14:50:56
【问题描述】:

我正在玩一个基本的计算器窗口应用程序,并试图在按下回车键时让它计算方程。目前,如果我给它 2+2 并单击我的相等按钮,它应该注册 4。当我按下键盘上的回车键时,我希望得到相同的响应。我正在尝试使用此代码执行此操作:

if (e.KeyCode == Keys.Enter)
{
    equal.PerformClick();
}

结果为 2+22(最后输入的数字重复) 但是,如果我使用字母或 F 键(如下代码所示),它会返回正确答案:

if (e.KeyCode == Keys.C) 
{
    equal.PerformClick();
}

以下是“equal.PerformClick()”调用的代码供参考

decimal numA;
decimal numB;
decimal result = 0;
//-------------------------------------------------------------
decimal.TryParse(this.first_num_label.Text, out numA);
decimal.TryParse(this.label1.Text, out numB);
if (this.operator_name.Text == "+")
{
    result = numA + numB;
}
//---------------------------------------------------------------
if (this.operator_name.Text == "-")
{
    result = numA - numB;
}
//---------------------------------------------------------------
if (this.operator_name.Text == "x")
{
    result = numA * numB;
}
//---------------------------------------------------------------
if (this.operator_name.Text == "/")
{
    result = numA / numB;
}
//---------------------------------------------------------------
this.label1.Text = result.ToString();
this.first_num_label.Text = "";
this.operator_name.Text = "";

这里是完整的代码:。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Calc_project
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void clear_Click(object sender, EventArgs e)
        {
            //this.label1.Text = "";
            this.label1.ResetText();
        }

        private void one_Click(object sender, EventArgs e)
        {
            this.label1.Text = this.label1.Text + "1";
        }

        private void two_Click(object sender, EventArgs e)
        {
            this.label1.Text = this.label1.Text + "2";
        }

        private void three_Click(object sender, EventArgs e)
        {
            this.label1.Text = this.label1.Text + "3";
        }

        private void four_Click(object sender, EventArgs e)
        {
            this.label1.Text = this.label1.Text + "4";
        }

        private void five_Click(object sender, EventArgs e)
        {
            this.label1.Text = this.label1.Text + "5";
        }

        private void six_Click(object sender, EventArgs e)
        {
            this.label1.Text = this.label1.Text + "6";
        }

        private void seven_Click(object sender, EventArgs e)
        {
            this.label1.Text = this.label1.Text + "7";
        }

        private void eight_Click(object sender, EventArgs e)
        {
            this.label1.Text = this.label1.Text + "8";
        }

        private void nine_Click(object sender, EventArgs e)
        {
            this.label1.Text = this.label1.Text + "9";
        }

        private void zero_Click(object sender, EventArgs e)
        {
            this.label1.Text = this.label1.Text + "0";
        }

        private void plus_Click(object sender, EventArgs e)
        {
            this.operator_name.Text = "+";
            if (this.label1.Text != "")
            {
                this.first_num_label.Text = this.label1.Text;
            }
            this.label1.ResetText();
        }

        private void minus_Click(object sender, EventArgs e)
        {
            this.operator_name.Text = "-";
            if (this.label1.Text != "")
            {
                this.first_num_label.Text = this.label1.Text;
            }
            this.label1.ResetText();
        }

        private void multiply_Click(object sender, EventArgs e)
        {
            this.operator_name.Text = "x";
            if (this.label1.Text != "")
            {
                this.first_num_label.Text = this.label1.Text;
            }
            this.label1.ResetText();
        }

        private void div_Click(object sender, EventArgs e)
        {
            this.operator_name.Text = "/";
            if (this.label1.Text != "")
            {
                this.first_num_label.Text = this.label1.Text;
            }
            this.label1.ResetText();
        }
        

        private void equal_Click(object sender, EventArgs e)
        {
            decimal numA;
            decimal numB;
            decimal result = 0;
            //-------------------------------------------------------------
            decimal.TryParse(this.first_num_label.Text, out numA);
            decimal.TryParse(this.label1.Text, out numB);
            if (this.operator_name.Text == "+")
            {
                result = numA + numB;
            }
            //---------------------------------------------------------------
            if (this.operator_name.Text == "-")
            {
                result = numA - numB;
            }
            //---------------------------------------------------------------
            if (this.operator_name.Text == "x")
            {
                result = numA * numB;
            }
            //---------------------------------------------------------------
            if (this.operator_name.Text == "/")
            {
                result = numA / numB;
            }
            //---------------------------------------------------------------
            this.label1.Text = result.ToString();
            this.first_num_label.Text = "";
            this.operator_name.Text = "";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.label1.ResetText();
            this.first_num_label.ResetText();
            this.operator_name.ResetText();
        }

        private void Decimal_Click(object sender, EventArgs e)
        {
            this.label1.Text = this.label1.Text + ".";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            decimal len;
            decimal wit;
            decimal area;
            decimal.TryParse(this.textBox1.Text, out len);
            decimal.TryParse(this.textBox2.Text, out wit);
            area = len * wit;
            if (ft.Checked == true)
            {
                this.label2.Text = area.ToString() +" square feet";
            }
            if (meters.Checked == true)
            {
                this.label2.Text = area.ToString() +" square meters";
            }
            if (cm.Checked == true)
            {
                this.label2.Text = area.ToString() + " square centimeters";
            }
            if (yards.Checked == true)
            {
                this.label2.Text = area.ToString() + " square yards";
            }
            //else
            //{
            //    this.label2.Text = area.ToString();
            //}

        }

        private void button3_Click(object sender, EventArgs e)
        {
            this.textBox1.Text = "";
            this.textBox2.Text = "";
            this.label2.ResetText();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            decimal ar;
            decimal cov;
            decimal req;
            //--------------------------------------------
            decimal.TryParse(this.textBox4.Text, out ar);
            decimal.TryParse(this.textBox3.Text, out cov);
            //--------------------------------------------
            req = ar / cov;
            this.requirement.Text = req.ToString() + " Gallons";
        }

        private void button5_Click(object sender, EventArgs e)
        {
            decimal Slabar;
            decimal Slabtk;
            decimal TKft;
            decimal cubFt;
            decimal ConYard;
            //--------------------------------------------
            decimal.TryParse(this.textBox5.Text, out Slabar);
            decimal.TryParse(this.textBox6.Text, out Slabtk);
            //--------------------------------------------
            TKft = Slabtk / 12;
            cubFt = Slabar * TKft;
            ConYard = cubFt / 27;
            //--------------------------------------------
            this.label10.Text = ConYard.ToString();

        }

             
        private void tabControl1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                equal.PerformClick();
            }
            if (e.KeyCode == Keys.F1) //this code works
            {
                MessageBox.Show("test");
            }
            if (e.KeyCode == Keys.Escape) //so does this
            {
                this.Close();
            }
            if (e.KeyCode == Keys.NumPad9) // also works
            {
                this.label1.Text = this.label1.Text + "9";
            }
            if (e.KeyCode == Keys.F2) 
            {
                equal.PerformClick();
            }
        }
    }
}

【问题讨论】:

  • "但是,它不能使用 enter 键,只能使用 enter 键。"嗯?
  • 这里缺少很多信息,尤其是其中什么技术。请添加相关标签并向我们展示minimal reproducible example
  • 我选择的任何其他键(字母、F 键)都可以正常工作,只是不输入。
  • 您的问题确实不清楚,但首先,根据文档 (docs.microsoft.com/en-us/dotnet/api/…),Keys.EnterKeys.Return 是完全一样的,所以您实际尝试的是哪两个键使用?
  • 问题不是你对 C# 的陌生,而是你的问题,尤其是这句话,没有任何意义:“按 Enter 时完成方程式,就像单击 Enter 按钮时一样。但是,它不适用于回车键,只能使用回车键。” - 请澄清您的问题。

标签: c# windows visual-studio


【解决方案1】:

根据我的测试,您的代码运行良好。如果还是有问题,我建议你可以使用 Form_KeyDown 事件。

这是一个代码示例,您可以参考。

public Form1()
        {
            InitializeComponent();
            this.KeyPreview = true;
        }
 private void Form1_KeyDown(object sender, KeyEventArgs e)
        {

            if (e.KeyCode == Keys.Enter)
            {
                equal.PerformClick();
            }
         }

我将控件焦点固定到 textbox1 以防止 Enter 键受到输入数字的影响。

输入每个数字后,请设置textBox1.Focus()。方法。

如下图:

 private void one_Click(object sender, EventArgs e)
        {
            this.label1.Text = this.label1.Text + "1";
            textBox1.Focus();
        }

        private void two_Click(object sender, EventArgs e)
        {
            this.label1.Text = this.label1.Text + "2";
            textBox1.Focus();
        }
        ......
        ......

最后最好检查一下回车键是否正常。

【讨论】:

  • 谢谢,我昨晚深夜偶然发现了同样的解决方案,还没有机会更新这个问题。我很高兴看到这是一个合理的解决方案,而不是时髦的创可贴
  • 我修改了代码,现在回车键可以按我的意愿工作。不知何故,代码只是感觉笨重和臃肿。我将继续学习并在我前进的过程中重新审视。
  • @TravisRichards,很高兴您的问题得到了解决,您可以点击“✔”将相应的回复标记为答案。
【解决方案2】:

我假设您正在收听KeyPress 事件?如果是这样,您是否尝试将 Keys.Enter 值转换为字符?

private void element_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Enter)
    {
        // Do stuff here
    }
}

Keys.EnterKeys.Return 返回相同的值,因此选择哪一个并不重要。

【讨论】:

  • 还需要添加什么?这会出现以下错误:CS1061 'KeyEventArgs' 不包含 'KeyChar' 的定义,并且找不到接受类型为 'KeyEventArgs' 的第一个参数的可访问扩展方法 'KeyChar'(您是否缺少 using 指令或程序集引用?)
  • 我看到你正在使用KeyDown 事件。我唯一能想到的是 Enter-Key 的 KeyDown 事件被您的按钮吞噬了。我建议将 KeyDown 事件更改为 KeyUp 事件。这可能会解决您的问题。
  • 我得到了与 KeyDown 事件相同的结果。我的代码中一定还有其他问题,我只需要逐行查看即可。感谢您的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 2014-02-21
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
相关资源
最近更新 更多