如果用户点击带有 KeyUp 事件的Windows窗体文本框,则窗口会发出哔声或叮当声。我无法确定为什么会发生这种情况以及如何避免这种情况。
任何帮助都将不胜感激。
答案 0 :(得分:11)
摆脱声音的实际解决方案:
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
}
}
答案 1 :(得分:8)
我想这是由以下因素组合引起的:
MultiLine = false
因为单行文本框将回车键转发到默认按钮。无法找到默认按钮时会生成ding。
答案 2 :(得分:3)
以下是实际答案:
Private Sub myTextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles myTextBox.KeyPress
If Asc(e.KeyChar) = 13 Then
e.Handled = True
End If
End Sub
这会按下按键,这可以防止叮咬。
答案 3 :(得分:1)
经过几个小时的挖掘解决方案,我得到了一个解决方法,但不是解决这个问题的真正解决方案。现在我正在使用 KeyDown 。
private void tbSearch_KeyDown( object sender, KeyEventArgs e )
{
if ( e.KeyCode == Keys.Enter )
{
e.Handled = true;
// Call Button event
//btnSearch_Click( sender, EventArgs.Empty );
// cleaner code. Thanks to Hans.
btnSearch.PerformClick();
}
}
对所有开发人员都有一个有用的建议:不要测试你的应用程序静音。 ; - )
答案 4 :(得分:0)
上述解决方案都没有为我完成这项工作......但这是我的简单解决方案! 只有在您的应用程序中不再需要Acceptbutton时,它才有效。
private void txtPassword_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter) { cmdLogin.PerformClick(); }
}
private void txtPassword_Enter(object sender, EventArgs e)
{
this.Acceptbutton = this.cmdLogin;
}
private void txtPassword_Leave(object sender, EventArgs e)
{
this.Acceptbutton = Null;
}
这样,当按下“Enter”时,你不会听到焦点对特定文本框的ping!
答案 5 :(得分:0)
当用户从单行文本框中输入时,我从自定义控件调用myDialog.ShowDialog()时会出现此问题的版本。
(他们将产品编号放入文本框,按回车键,弹出对话框,让他们从可用尺寸中进行选择。但如果每次弹出对话框时都会播放铃声,那就太麻烦了。)
我在文本框中捕获了按键事件,并设置了e.Handled和e.SupressKeypress,但这并没有解决问题。然后我注意到如果我注释掉对myDialog.ShowDialog()的调用,那么我没有得到声音,就像那样奇怪。在那种情况下,e.Handled和e.SupressKeypress确实阻止了铃声。
我想也许事件以某种方式被传递到对话框,所以我在表单级别和表单的每个元素上捕获了keydown事件,并且完全按键,并设置e.Handled和e.SuppressKeypress其中每一个,但没有解决它。
我尝试在表单上放置一个提交按钮,并将表单的AcceptButton属性设置为该按钮,但这也无济于事。
我在调用myDialog.ShowDialog()之前尝试调用Application.DoEvents(),但是没有修复它。
我注意到,即使调用myDialog.ShowDialog()被注释掉,调用Application.DoEvents()也会导致铃声播放!好像调用DoEvents正在处理当前事件而不关注e.Handled和e.SupressKeypress限定符。
所以..我想如果我在限定符发挥时让当前事件发挥作用,然后然后提升我的对话框会怎么样?
所以我将myDialog.ShowDialog()放入BeginInvoke部分(因为我的印象是,调用会在主消息队列中添加一条消息,导致在处理该消息时调用该方法):
BeginInvoke((MethodInvoker)delegate {
SelectProduct(); // <-- pops the size selection dialog
});
信不信由你,修好了 - 没有铃声。
(当我需要在后台线程调用回调时更新视图时,我通常使用调用,因为WinForms视图不允许从主线程以外的线程更新它们。)
所以我猜测单行文本框所在的自定义控件是需要接受按钮的位置 - 但是自定义控件没有AcceptButton属性。
WinForms编程似乎有点像黑色艺术。就像其他类型的编程一样,我想。