VB.NET2005です。
テキストボックスの内容が変更されたかどうかは
「Modified」プロパティ(True/False)で判定可能ですが、
チェックボックスの内容が変更されたかどうかを
プロパティで判定するにはどうすればよいですか?
もちろんCheckBoxのCheckedChangedイベントで判定自体は可能なのですが、
テキストボックス等はすべてLostFocus時に一律して
入力内容をチェックしているので、チェックボックスも
同じようにしたいのです。
CheckBoxのプロパティに「Modified」プロパティを追加する方法を
教えて下さい。
何卒よろしくお願い申し上げます。
> CheckBoxのプロパティに「Modified」プロパティを追加する方法を
> 教えて下さい。
CheckBox を継承したコントロールを作成し、そこに Modified プロパティを
実装してみてください。詳細は、ヘルプのチュートリアル
『Visual Basic による Windows フォーム コントロールからの継承』を参照のこと。
> もちろんCheckBoxのCheckedChangedイベントで判定自体は可能なのですが、
継承する場合は、CheckedChanged / CheckStateChanged イベントに
処理を書くのではなく、OnCheckedChanged / OnCheckStateChanged を
オーバーライドした方が良いでしょうね。
お返事ありがとうございます。
無事Modifiedプロパティを追加することが出来ました。
教えて頂いたようにCheckedChangedではなく、
OnCheckedChangedへModified=Trueの処理を記述し、
うまく動作しております。
ただ、一つ確認させて頂きたいのですが、
> OnCheckedChanged / OnCheckStateChanged を
> オーバーライドした方が良いでしょうね。
というのはOnCheckedChangedとOnCheckStateChangedの両方に
同様の記述が必要ということでしょうか。
※OnCheckedChangedだけでは不十分なのでしょうか。
何卒よろしくお願い申し上げます。
チェックボックスを、Checked プロパティの 2 ステートで使うのか、
それとも CheckState プロパティの 3 ステートで使うのかの違いです。
どちらを使うことになるのか(あるいは両方使うのか)で判断してください。
蛇足までに書いておくと、CheckBox の Checked プロパティというのは、
CheckState をカプセル化しているだけだったりします。
また、CheckedChanged / CheckStateChanged イベントを発生させるための
オーバーライダブルな OnCheckedChanged / OnCheckStateChanged メソッドは、
(Checked プロパティの実装ではなく)CheckState プロパティの実装から呼ばれています。
CheckBox の内部実装を VB.NET のイメージで書くと、こんな感じ。
# 細かい点は端折ってます。
==========================================
'---- 内部的には、(2ステートではなく)3ステートな値として保持されている。
Private 内部値 As CheckState
'---- Checked プロパティの実装 ----
Public Property Checked As Boolean
Get
' Checked プロパティは、実際には CheckState の値を返している。
Return CBool(内部値 <> CheckState.Unchecked)
End Get
Set (ByVal value As Boolean)
If (Checked <> value) Then
' Checed プロパティへの代入は、CheckState への代入へと変換される。
If value Then
CheckState = CheckState.Checked
Else
CheckState = CheckState.Unchecked
End If
End If
End Set
End Property
'---- CheckState プロパティの実装 ----
Public Property CheckState As CheckState
Get
' CheckState プロパティは、そのままの値。
Return 内部値
End Get
Set (ByVal value As CheckState)
If (内部値 <> value) Then
Dim preChecked As Boolean = Checked
内部値 = value
' OS に対する処理
SendMessage(MyClass.Handle, BM_SETCHECK, CInt(内部値), 0)
' 値が変更されていたら、RaiseEvent 用メソッドを呼び出す。
If (preChecked <> Checked) Then
OnCheckedChanged(EventArgs.Empty)
End If
OnCheckStateChanged(EventArgs.Empty)
End If
End Set
End Property
==========================================
お返事ありがとうございます。
コードイメージまで書いて頂いたので
とてもよく分かりました!
本当にありがとうございました。
ツイート | ![]() |