none
GroupBox内コントロールのEnabledを個別に変更したかどうか知りたい RRS feed

  • 質問

  • 標準動作として、GroupBox1内に、ComboBox1を設置した際、
    何もしなければGroupBox1.Enabledの変更でComboBox1.Enabledも
    一緒に切り替わると思います。

    しかし、ComboBox1.Enabled = Falseとした直後に
    GroupBox1.Enabled = Trueとしても、ComboBox1.Enabledは
    GroupBox1.Enabledにひっぱられることなく、Falseのままになります。

    ComboBox1などの独自コントロール制御でEnabledのTrue/False切り替えを
    行っているのですが、上記のようにGroupBox.Enabledを変更したのか、
    自分自身のEnabledを直接変更したのかが判断つきません。

    親がGroupBoxなどで、かつ、Enabledが連動している場合のみ、独自制御を
    行わないようにしたいのですが、どうすると判断できるのでしょうか?
    2013年7月29日 7:37

回答

  • 今回の質問は「親がGroupBoxなどで、かつ、Enabledが連動している場合のみ、独自制御」でしたよね。

    1. 自身がTrue で、親もTrue  → True  (親に連動しているワケでは無いが親と同値)
    2. 自身がFalseで、親はTrue  → False (親に連動していないので異値)
    3. 自身がTrue で、親はFalse → False (親に連動しているため親と同値)
    4. 自身がFalseで、親もFalse → False (親に連動しているワケでは無いが親と同値)

    ということは、上記の3のパターンのみ検出できれば良いという話かと思いますが、だとすれば、先の私のコードで言えば、

    If CheckBox1.GetEnabled() AndAlso Not CheckBox1.Enabled Then
        MsgBox("Enabledが連動している状態")
    End If

    のような判定条件になるかと思います。

    • 回答としてマーク takiru 2013年7月30日 5:08
    2013年7月30日 4:01

すべての返信

  • takiru0105 さま よろしく。

    子のコントロールの Enable 切替時に
     親がGroupBoxなどで、かつ、Enabledが連動している場合のみ、独自制御を
    行わないようにしたいのですが 
    をそのまま、記述したら如何ですか?  例えば、こんな感じ。

           If Me.GroupBox1.Enabled Then
                Me.ComboBox1.Enabled = Not Me.ComboBox1.Enabled
            Else
                MessageBox.Show("Not Exchange , Because of Not Parent Enable")
            End If
    上記のコードは無意味でした。 以下の投稿を参照下さい。  後日加筆。
    • 回答の候補に設定 星 睦美 2013年7月30日 0:31
    • 編集済み ShiroYuki_Mot 2013年7月30日 4:45 無意味なコードを提案。すみません。
    2013年7月29日 9:01
  • 「自分自身の Enabled 値」を表す内部値を、拡張メソッドで拾うようにしてみました。
    CheckBox1.GetEnabled() のようにして使います。

    リフレクション依存となってしまうのが難点ですが…。

    Imports System.Runtime.CompilerServices
    Imports System.Reflection
    Public Module Module1
        <Flags()> Private Enum InternalState
            Created = &H1
            Visible = &H2
            Enabled = &H4
        End Enum
    
        <Extension()> _
        Public Function GetEnabled(ByVal this As Control) As Boolean
            Return this.GetState(InternalState.Enabled)
        End Function
    
        <Extension()> _
        Public Function GetVisible(ByVal this As Control) As Boolean
            Return this.GetState(InternalState.Visible)
        End Function
    
        <Extension()> _
        Private Function GetState(ByVal c As Control, ByVal f As Integer) As Boolean
            Static bf As BindingFlags = BindingFlags.Instance Or BindingFlags.NonPublic
            Return CBool(c.GetType().GetMethod("GetState", bf).Invoke(c, New Object() {f}))
        End Function
    
    End Module
    • 編集済み 魔界の仮面弁士MVP 2013年7月29日 9:19 コードブロックが VB 用になっていなかった点を修正
    • 回答の候補に設定 星 睦美 2013年7月30日 0:31
    2013年7月29日 9:17
  • フォーラム オペレーターの星 睦美です。

    takiru0105 さん、投稿ありがとうございます。

    私からShiroyuki_Mot さんと魔界の仮面弁士 さんからの返信を[回答の候補に設定]させていただきました。

    回答の内容に質問がありましたら返信をお願いします。

    フォーラムの回答者からのアドバイスが参考になりましたら、投稿者から[回答としてマーク]いただければ幸いです。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年7月30日 0:37
  • ご回答ありがとうございます。

    しかしながら、使い方の根本的な考え方が間違っているのか、よくわかりませんでした。

    1.GroupBox1.Enabled=Trueの時にCheckBox1.Enabled=Falseと設定。
    2.GroupBox1.Enabled=Falseと設定。
    3.GroupBox1.Enabled=Trueと設定。

    手順3.まで行っても、CheckBox1.EnabledはFalseのままになるのですが、
    そうなるのは手順1.が行われた場合だけです。

    教えていただいた方法では、その時点での自身のEnabledしか分からないように
    見受けられましたが、使い方を誤っているでしょうか?

    2013年7月30日 3:09
  • 今回の質問は「親がGroupBoxなどで、かつ、Enabledが連動している場合のみ、独自制御」でしたよね。

    1. 自身がTrue で、親もTrue  → True  (親に連動しているワケでは無いが親と同値)
    2. 自身がFalseで、親はTrue  → False (親に連動していないので異値)
    3. 自身がTrue で、親はFalse → False (親に連動しているため親と同値)
    4. 自身がFalseで、親もFalse → False (親に連動しているワケでは無いが親と同値)

    ということは、上記の3のパターンのみ検出できれば良いという話かと思いますが、だとすれば、先の私のコードで言えば、

    If CheckBox1.GetEnabled() AndAlso Not CheckBox1.Enabled Then
        MsgBox("Enabledが連動している状態")
    End If

    のような判定条件になるかと思います。

    • 回答としてマーク takiru 2013年7月30日 5:08
    2013年7月30日 4:01
  • takiru0105 さま よろしく。

    簡単なものを書いて、現象を確認できました。

    GroupBox1 の .Enable を切り替える時に、子供の .Enable も指定しないと駄目みたいですね。
    以下の例では、Button5 でトグルします。

        Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
            Me.GroupBox1.Enabled = Not Me.GroupBox1.Enabled
            Me.Button1.Enabled = IIf(Me.GroupBox1.Enabled, True, False)
            Me.ComboBox1.Enabled = IIf(Me.GroupBox1.Enabled, True, False)
        End Sub

    先の投稿の 子供の .Enable 指定時の条件分岐は不要でした。すみません。

    2013年7月30日 4:22
  • 再度ご回答ありがとうございます。

    それぞれの動作の確認を行い、確かにそれぞれの状態の『親の状態を無視したCheckBoxのEnabled』が取得できていて、
    教えて頂いたように、通常のEnabledとの比較によって求めていたものを得ることができました。

    ありがとうございました。

    2013年7月30日 5:07