チェックボックスの値が変更されたかどうかをプロパティで判定するには?

解決


モモ  2007-04-25 00:16:55  No: 136201

VB.NET2005です。
テキストボックスの内容が変更されたかどうかは
「Modified」プロパティ(True/False)で判定可能ですが、
チェックボックスの内容が変更されたかどうかを
プロパティで判定するにはどうすればよいですか?
もちろんCheckBoxのCheckedChangedイベントで判定自体は可能なのですが、
テキストボックス等はすべてLostFocus時に一律して
入力内容をチェックしているので、チェックボックスも
同じようにしたいのです。
CheckBoxのプロパティに「Modified」プロパティを追加する方法を
教えて下さい。
何卒よろしくお願い申し上げます。


魔界の仮面弁士  2007-04-25 01:39:17  No: 136202

> CheckBoxのプロパティに「Modified」プロパティを追加する方法を
> 教えて下さい。
CheckBox を継承したコントロールを作成し、そこに Modified プロパティを
実装してみてください。詳細は、ヘルプのチュートリアル
『Visual Basic による Windows フォーム コントロールからの継承』を参照のこと。

> もちろんCheckBoxのCheckedChangedイベントで判定自体は可能なのですが、
継承する場合は、CheckedChanged / CheckStateChanged イベントに
処理を書くのではなく、OnCheckedChanged / OnCheckStateChanged を
オーバーライドした方が良いでしょうね。


モモ  2007-04-25 04:23:45  No: 136203

お返事ありがとうございます。
無事Modifiedプロパティを追加することが出来ました。
教えて頂いたようにCheckedChangedではなく、
OnCheckedChangedへModified=Trueの処理を記述し、
うまく動作しております。
ただ、一つ確認させて頂きたいのですが、
> OnCheckedChanged / OnCheckStateChanged を
> オーバーライドした方が良いでしょうね。
というのはOnCheckedChangedとOnCheckStateChangedの両方に
同様の記述が必要ということでしょうか。
※OnCheckedChangedだけでは不十分なのでしょうか。
何卒よろしくお願い申し上げます。


魔界の仮面弁士  2007-04-25 05:41:20  No: 136204

チェックボックスを、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
==========================================


モモ  2007-04-26 21:57:09  No: 136205

お返事ありがとうございます。
コードイメージまで書いて頂いたので
とてもよく分かりました!
本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加