在多行TextBox上拦截返回键,防止关闭对话框

时间:2012-09-21 07:40:11

标签: .net winforms events

我有一个.net WinForm对话框,它显示一些TextBoxes(其中一些是 Multiline ),一个标记为 AcceptButton 的按钮和一个标记为 CancelButton的按钮

当您点击返回键时,会触发 AcceptButton 的onClick事件并关闭对话框。

问题是即使用户试图在多行TextBox中插入新段落,也会触发onClick事件。阻止关闭表单的唯一方法是按CTRL + Return。

这显然是WinForm TextBox控件的一个错误。 例如,DataGridView正确捕获Return键,并且不会将其传递给WinForm对话框。

Treid 选择()焦点(),覆盖 PreProcessMessage ProcessKeyMessage (奇怪的是没有甚至火灾。没有运气。

2 个答案:

答案 0 :(得分:2)

我很蠢!

TextBox的布尔属性名为 AcceptReturn

我认为在检查 Multiline 时,VS应该自动查询。

答案 1 :(得分:0)

我解决了在接受按钮的onClick事件处理程序中检查Focus状态+ ReturnKey状态

If (UdaNoteTextBox.Focused) Then
    Dim returnKey As NullFX.Win32.KeyStateInfo = NullFX.Win32.KeyboardInfo.GetKeyState(Keys.Enter)
    If (returnKey.IsPressed) Then
        Dim caretFinalPos As Int32 = UdaNoteTextBox.SelectionStart + 2
        UdaNoteTextBox.Text = UdaNoteTextBox.Text.Substring(0, UdaNoteTextBox.SelectionStart) + vbCrLf + UdaNoteTextBox.Text.Substring(UdaNoteTextBox.SelectionStart + UdaNoteTextBox.SelectionLength)
        UdaNoteTextBox.SelectionStart = caretFinalPos
        UdaNoteTextBox.SelectionLength = 0
        UdaNoteTextBox.ScrollToCaret()
        Return
    End If
End If

要检查ReturnKey状态,我使用了这个类,它导入旧的User32.dll,因为.net框架中似乎不存在此函数。

http://sanity-free.com/17/obtaining_key_state_info_in_dotnet_csharp_getkeystate_implementation.html