单击“在对话框中输入”无法正常工作

时间:2013-11-26 19:50:13

标签: c# .net winforms messagebox

我现在有一个奇怪的问题,我的程序中有一个登录表单。基本上,如果用户输入了错误的登录名,然后点击弹出窗口中的输入,则会关闭它并再次提交登录表单。有没有办法阻止这种情况?因此,当用户按Enter键关闭弹出窗口时,输入按下不会在我的登录表单中注册?

来自我登录表单的代码。 Button1是登录按钮谢谢!

private void button1_Click(object sender, EventArgs e)
    {
        if (textBox1.Text == "" || textBox2.Text == "")
        {
            MessageBox.Show("Please enter a username and password!");
        }
        else
        {
            bool loggedin = false;
            for (int i = 0; i <= Program.ProfileList.Count - 1; i++)
            {
                if (Program.ProfileList[i].Username == textBox1.Text)
                {
                    AESEncrypt encrypt = new AESEncrypt();
                    if (Program.ProfileList[i].Password == encrypt.EncryptToString(textBox2.Text))
                    {
                        MessageBox.Show("Succesfully logged in!");
                        Program.ActiveUser = textBox1.Text;
                        loggedin = true;
                        this.Close();
                    }
                }
            }
            if (!loggedin)
            {
            MessageBox.Show("Incorrect username or password!");
            }

        }
    }

    private void textBox2_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            button1.PerformClick();
        }
    }

3 个答案:

答案 0 :(得分:1)

这是因为您使用了KeyUp事件。并按下Enter键以关闭消息框。这是正确的,它使用KeyDown事件。因此对话框关闭,TextBox获得焦点并释放Enter键。要再次触发KeyUp事件:)

还要打开扬声器,听听令人讨厌的DING!你从不喜欢Enter键的文本框中得到。

改为使用KeyDown事件:

    private void textBox2_KeyDown(object sender, KeyEventArgs e) {
        if (e.KeyCode == Keys.Enter) {
            button1.PerformClick();
            e.Handled = e.SuppressKeyPress = true;
        }
    }

答案 1 :(得分:0)

当出现此问题时,焦点是textBox2所代表的TextBox?这可能是发生的事情:

  1. 用户输入了错误的用户名和密码。
  2. 用户在密码字段中按下Enter键。
  3. 显示MessageBox,表示用户名和密码不正确。
  4. 用户按Enter键以关闭MessageBox。
  5. 我对此并不乐观,但是当收到回车键的按键事件时,很可能会关闭MessageBox。焦点更改回登录表单,特别是密码字段(焦点在显示MessageBox之前)。密钥启动事件被发送到焦点对照,即密码字段 - 再次触发登录检查。

    要解决此问题,请删除密钥向上处理程序并将Form.AcceptButton属性设置为“确定/登录”按钮,并将Form.CancelButton属性设置为“取消”按钮。这将自动允许enter进入OK / Login按钮,Escape按下Cancel按钮。

答案 2 :(得分:0)

您可以按如下方式解决。您还必须将KeyPreview属性设置为true。

  

获取或设置一个值,该值指示表单是否将接收密钥   将事件传递给具有焦点的控件之前的事件。

        private void Form1_Load(object sender, EventArgs e)
        {
            this.KeyPreview = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(textBox1.Text.Trim()) || string.IsNullOrEmpty(textBox2.Text.Trim()))
            {
                MessageBox.Show("Please enter a username and password!");
            }
            else if (IsValidUser(textBox1.Text.Trim(), textBox2.Text.Trim()))
            {
                MessageBox.Show("Succesfully logged in!");
                Program.ActiveUser = textBox1.Text;
                this.Close();
            }
            else
            {
                MessageBox.Show("Incorrect username or password!");
            }
        }
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                button1.PerformClick();
            }
        }

        private bool IsValidUser(string userName, string userPassword)
        {
            for (int i = 0; i <= Program.ProfileList.Count - 1; i++)
            {
                if (Program.ProfileList[i].Username == userName)
                {
                    AESEncrypt encrypt = new AESEncrypt();
                    if (Program.ProfileList[i].Password == encrypt.EncryptToString(userPassword))
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            return false;
        }