DOBON.NET DOBON.NETプログラミング掲示板過去ログ

チェックボックスで表示切り換えられるパネルを作りたい

環境/言語:[VS2005 VB.NET]
分類:[.NET]

こんにちは。
チェックボックスを利用してポップアップするパネルのような
ユーザーインターフェースを作りたいと思っています。

そこで、チェックボックスとパネルの表示/非表示の制御が
どうも、うまくいきません。
教えてください。

使い勝手としては
[1]    チェックボックス(というかボタン型のチェックボックス)
    を切り替えチェックON/OFFする事でパネルが表示/非表示する。

[2]    パネルがフォーカスを失うと非表示になり
    チェックボックスもチェックOFFになる。

これだけを実現したいのですが、なぜかうまくいきません。

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        CheckBox1.AutoCheck = False
        CheckBox1.Checked = False
        Panel1.Visible = False
    End Sub

    Private Sub Panel1_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Panel1.Leave
        CheckBox1.Checked = False
    End Sub

    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
        If CheckBox1.Checked Then
            Panel1.Visible = True
            Panel1.Focus()
        Else
            Panel1.Visible = False
        End If
    End Sub

    Private Sub CheckBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.Click
        CheckBox1.Checked = Not CheckBox1.Checked
    End Sub

このようにすると、うまくいくかと思ったのですが
[2]はOKですが

[1]を行うと、チェックを押そうとしているときに
パネルがフォーカスを失って非表示になってしまって
チェックを解除することができません。


CheckBox1.AutoCheck=Falseにしているのは
制御しやすそうだから試していただけで
=Trueでも、動けばいいのですが
うまく書けませんでした。

ご存じの方、よろしくお願いします。

なんでこんな簡単な制御ができないのかな....
定型的なやり方があるのでしょうか?
leaveイベントなんて、使わないのだろうか。
2009/09/04(Fri) 22:08:59 編集(投稿者)

お疲れ様です
以下のコードで試してみてください
 
' CheckBox1とPanel1をFormに配置し、Panel1の中にTextBoxを配置してください
Public Class Form7
 
    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        Me.Panel1.DataBindings.Add("Visible", Me.CheckBox1, "Checked")
        MyBase.OnLoad(e)
    End Sub
 
    Private Sub Panel1_MouseLeave(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Panel1.MouseLeave
        Dim p As Point = Me.Panel1.PointToClient(Cursor.Position)
        If Me.Panel1.ClientRectangle.Contains(p) = False Then
            Me.CheckBox1.Checked = False
        End If
    End Sub
 
    Private Sub Panel1_Leave(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Panel1.Leave
        Me.CheckBox1.Checked = False
    End Sub
 
End Class
2009/09/07(Mon) 12:10:23 編集(投稿者)
ありがとうございます!
動きました。

FormLoadでは、DataBindingsはエラーになるのですね。
FormLoadとOnLoadでは、何か動作が違うのでしょうか?
調べてみたのですが、よくわかりませんでした。



■No25357に返信(H.K.R.さんの記事)
> 2009/09/04(Fri) 22:08:59 編集(投稿者)
>
> お疲れ様です
> 以下のコードで試してみてください
>  
> ' CheckBox1とPanel1をFormに配置し、Panel1の中にTextBoxを配置してください
> Public Class Form7
>  
> Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
> Me.Panel1.DataBindings.Add("Visible", Me.CheckBox1, "Checked")
> MyBase.OnLoad(e)
> End Sub
>  
> Private Sub Panel1_MouseLeave(ByVal sender As Object, _
> ByVal e As System.EventArgs) Handles Panel1.MouseLeave
> Dim p As Point = Me.Panel1.PointToClient(Cursor.Position)
> If Me.Panel1.ClientRectangle.Contains(p) = False Then
> Me.CheckBox1.Checked = False
> End If
> End Sub
>  
> Private Sub Panel1_Leave(ByVal sender As Object, _
> ByVal e As System.EventArgs) Handles Panel1.Leave
> Me.CheckBox1.Checked = False
> End Sub
>  
> End Class
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板