>todo様 shu様 よねKEN様
皆さんに教えていただいたことを、
参考にいろいろ確認してみたところ以下のことがわかりました。
A(ContainerControlを継承したControl上に設置されたControl)から、
B(別のContainerControlを継承したAとは別のControl上に設置されたTextBox)に左クリックで、
フォーカスを移動するとAのValidatingイベントが1〜2回発生するようです。
(Validatingイベントキャンセル時のみ)
例)Form上に設置されたTextBox、ComboBoxからSplitContainer、UserControl上のTextBoxに
クリックでフォーカスを移すとValidatingイベントが1〜2回発生。
※すべてのControlを確認できているわけでは、ありませんのでご注意を。
で、
以下のように 作成してみました。
***************************************************************************************************
Module Module1
Public IsMouseDown As Boolean = False
Public Canceled As Boolean = False
End Module
Public Class TextBoxEx
Inherits TextBox
Private Const WM_LBUTTONDOWN As Integer = &H201
Private Const WM_LBUTTONUP As Integer = &H202
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_LBUTTONDOWN Then
IsMouseDown = True
Canceled = False
End If
MyBase.WndProc(m)
If m.Msg = WM_LBUTTONUP Then
IsMouseDown = False
End If
End Sub
Protected Overrides Sub OnValidating(ByVal e As System.ComponentModel.CancelEventArgs)
If IsMouseDown And canceled Then
e.Cancel = True
Else
MyBase.OnValidating(e)
Canceled = e.Cancel
End If
End Sub
End Class
----------------------------------------
Validatingのチェックが必要になるコントロールに
OnValidatingの修正が必要。
Public Class CheckBoxEx
Inherits CheckBox
Protected Overrides Sub OnValidating(ByVal e As System.ComponentModel.CancelEventArgs)
If IsMouseDown And Canceled Then
e.Cancel = True
Else
MyBase.OnValidating(e)
Canceled = e.Cancel
End If
End Sub
End Class
もしくは、フォーム上に配置されたControlのValidatingイベントに
上記のような条件でチェックを回避する処理が必要かと思います。
----------------------------------------
***************************************************************************************************
>todo様 shu様 よねKEN様
皆様 色々教えていただき、本当にありがとうございます。
|