1

.net WinFormダイアログがあり、いくつかのTextBox(一部はMultiline)、AcceptButtonとしてマークされたボタン、およびCancelButtonとしてマークされたボタンが表示されます

Returnキーを押すと、AcceptButtonのonClickイベントがトリガーされ、ダイアログが閉じます。

問題は、ユーザーが複数行のテキストボックスに新しい段落を挿入しようとしても、onClickイベントがトリガーされることです。フォームが閉じないようにする唯一の方法は、CTRL+Returnを押すことです。

これは明らかにWinFormTextBoxコントロールのバグです。たとえば、DataGridViewはReturnキーを正しくキャッチし、WinFormダイアログに渡しません。

Treid Select()Focus() 、 PreProcessMessageProcessKeyMessageのオーバーライド(奇妙なことに起動すらしません)。運がない。

4

2 に答える 2

2

私は愚かです!

AcceptReturnという名前のTextBoxのブールプロパティがあります。

Multilineをチェックするときは、VSによって自動チェックされる必要があると思います。

于 2012-09-21T09:58:56.707 に答える
0

Acceptボタンの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の状態を確認するために、この関数は.net Frameworkに存在しないようであるため、古いUser32.dllをインポートするこのクラスを使用しました。

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

于 2012-09-21T08:50:23.077 に答える