【问题标题】:keydown in c# doesn't work for some reasonc#中的keydown由于某种原因不起作用
【发布时间】:2012-01-28 11:13:51
【问题描述】:

我正在尝试做一个计算器,我所要做的就是让它与键盘一起工作。这应该有效,但它没有。

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.D1)
        {
            resultarea.Text = "fgdgd";
            //number(1);

        }
    ....
    }

知道可能出了什么问题吗?

编辑:它仍然无法正常工作。我想我不妨把整个代码贴出来。

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

    }
    double first = 0;
    double second = 0;
    string op = "";
    bool last = true;

    public void calculate()
    {
        double aux = first;
        first = second;

        if (op == "+")
            second = aux + second;
        else if (op == "-")
            second = aux - second;
        else if (op == "*")
            second = aux * second;
        else if (op == "/")
            if (second == 0)
                { first = aux; viewarea.Text = "Cannot divide by zero"; }
            else
                second = aux / second;
        //if (viewarea.Text == "Cannot divide by zero")
            resultarea.Text = second.ToString();

    }

    public void number(int digit)
    {
        if (last == true)
        {
            resultarea.Clear();
            last = false;
            first = second;
            second = 0;
        }
        resultarea.Text += digit.ToString();
        second = second * 10 + digit;

    }

    public void sign(string sign)
    {
        if (last==false && (first != 0 && second != 0))
            calculate();
        op = sign;
        debug.Text = op;
        last = true;
    }

    private void equal_Click(object sender, EventArgs e)
    {
        if (last == false && (first != 0 && second !=0 ))
            calculate();
        op = "";
        last = true;
    }

    private void one_Click(object sender, EventArgs e)
    {
        number(1);
    }

    private void two_Click(object sender, EventArgs e)
    {
        number(2);
    }

    private void plus_Click(object sender, EventArgs e)
    {
        sign("+");
    }

    private void minus_Click(object sender, EventArgs e)
    {
        sign("-");
    }



    private void three_Click(object sender, EventArgs e)
    {
        number(3);
    }

    private void creset_Click(object sender, EventArgs e)
    {
        first = 0;
        second = 0;
        op = "";
        last = true;
        viewarea.Text = "";
        resultarea.Text = "";
        debug.Text = "";
    }

    private void four_Click(object sender, EventArgs e)
    {
        number(4);
    }

    private void five_Click(object sender, EventArgs e)
    {
        number(5);
    }

    private void six_Click(object sender, EventArgs e)
    {
        number(6);
    }

    private void seven_Click(object sender, EventArgs e)
    {
        number(7);
    }

    private void eight_Click(object sender, EventArgs e)
    {
        number(8);
    }

    private void nine_Click(object sender, EventArgs e)
    {
        number(9);
    }

    private void zero_Click(object sender, EventArgs e)
    {
        number(0);
    }

    private void divide_Click(object sender, EventArgs e)
    {
        sign("/");
    }

    private void times_Click(object sender, EventArgs e)
    {
        sign("*");
    }

    private void sqr_Click(object sender, EventArgs e)
    {
        second = Math.Sqrt(second);
        resultarea.Text = second.ToString();
    }

    private void cos_Click(object sender, EventArgs e)
    {
        second = Math.Cos(second);
        resultarea.Text = second.ToString();
    }

    private void sin_Click(object sender, EventArgs e)
    {
        second = Math.Sin(second);
        resultarea.Text = second.ToString();
    }

    private void tan_Click(object sender, EventArgs e)
    {
        second = Math.Tan(second);
        resultarea.Text = second.ToString();
    }

    private void nfac_Click(object sender, EventArgs e)
    {
        double aux = second;
        if (second == 0)
            aux = 1;
        else
        for (double i = 1; i < second; i++)
            aux= aux*i;
        second = aux;
        resultarea.Text = second.ToString();
    }

    private void log_Click(object sender, EventArgs e)
    {
        second = Math.Log(second);
        resultarea.Text = second.ToString();
    }

    private void ln_Click(object sender, EventArgs e)
    {
        second = Math.Log10(second);
        resultarea.Text = second.ToString();
    }

    private void xexp_Click(object sender, EventArgs e)
    {
        second = Math.Pow(second ,2);
        resultarea.Text = second.ToString();
    }

    private void dot_Click(object sender, EventArgs e)
    {

    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.D1 || e.KeyCode == Keys.NumPad1)
        {
            viewarea.Text = "fgdgd";
            //number(1);


        }
        else if (e.KeyCode == Keys.D2 || e.KeyCode == Keys.NumPad2)
        {
            number(2);
        }
        else if (e.KeyCode == Keys.D3 || e.KeyCode == Keys.NumPad3)
        {
            number(3);
        }
        else if (e.KeyCode == Keys.D4 || e.KeyCode == Keys.NumPad4)
        {
            number(4);
        }
        else if (e.KeyCode == Keys.D5 || e.KeyCode == Keys.NumPad5)
        {
            number(5);
        }
        else if (e.KeyCode == Keys.D6 || e.KeyCode == Keys.NumPad6)
        {
            number(6);
        }
        else if (e.KeyCode == Keys.D7 || e.KeyCode == Keys.NumPad7)
        {
            number(7);
        }
        else if (e.KeyCode == Keys.D8 || e.KeyCode == Keys.NumPad8)
        {
            number(8);
        }
        else if (e.KeyCode == Keys.D9 || e.KeyCode == Keys.NumPad9)
        {
            number(9);
        }
        else if (e.KeyCode == Keys.Divide)
        {
            sign("/");
        }
        else if (e.KeyCode == Keys.Subtract)
        {
            sign("-");
        }
        else if (e.KeyCode == Keys.Add)
        {
            sign("+");
        }
        else if (e.KeyCode == Keys.Enter)
        {
            sign("=");
        }
    }
    private void Form1_Load(object sender, EventArgs e)
    {

    }


}

【问题讨论】:

  • 是 Winforms 还是 Wpf?您在表单上是否有其他控件,谁可能拥有焦点?
  • @Fischer,我们可以通过 KeyEventArgs 看到,它是 Windows 窗体。
  • 对不起,是的。当我按 1 时,resultarea 文本框里面没有文本
  • 当我按下任何键时什么都没有发生,除了按下所选按钮的空格 lol

标签: c# winforms calculator keydown


【解决方案1】:

假设您有一个 WinForms 项目,请将表单的 KeyPreview 属性设置为 true,就像这样(例如在构造函数中):

public Form1()
{
    InitializeComponent();
    KeyPreview = true;
}

它应该像你预期的那样工作。

编辑:由于您的评论,我添加了代码以捕获所有标志(将其添加到您的 Form1_KeyDown 方法中)

if (((e.KeyCode == Keys.D7) && (e.Modifiers == Keys.Shift)) || (e.KeyCode == Keys.Divide))
{
    sign("/");
}
else if (((e.KeyCode == Keys.Oemplus) && (e.Modifiers == Keys.Shift)) || (e.KeyCode == Keys.Multiply))
{
    sign("*");
}
else if ((e.KeyCode == Keys.OemMinus) || (e.KeyCode == Keys.Subtract))
{
    sign("-");
} 
else if ((e.KeyCode == Keys.Oemplus) || (e.KeyCode == Keys.Add))
{
    sign("+");
} 
else if (e.KeyCode == Keys.Enter)
{
    sign("=");
}

【讨论】:

  • 朋友,我看到了你的答案,我喜欢你自信地添加的方式它应该像你预期的那样工作 +1 :-)
  • @PankajUpadhyay:谢谢! :-D
  • @AndreiCristianProdan:Form1_KeyDown 方法是否在某些情况下被触发?是不是还在连线。除非我可以在您的示例代码中看到该事件的订阅,否则我猜它是在设计器中连接的。也许这迷路了?
  • 天哪,我简直不敢相信。我忘记了。去形成事件并添加我的keydown事件方法。现在工作。它仍然需要 KeyPreview = true,为什么?
  • 还有一件事。这些标志不像 Keys.Substract 等那样工作。知道为什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多