tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルチェックボックスのONOFFの判定
記事No9308
投稿日: 2009/08/28(Fri) 11:07
投稿者ちょぴ
VB2008ExpressEditionを使用しています。

とあるプログラムを作成しているのですが、もっと簡潔に表現できないかと思い、投稿させていただきます。
(現状、一応プログラムは思い通りに動いていますが、やたら同じような処理をしているので、もっといい方法等を勉強したいというのが主旨です)

画面仕様
チェックボックス「九州」
  チェックボックス「福岡」
  チェックボックス「佐賀」
  チェックボックス「長崎」
  チェックボックス「大分」
  チェックボックス「熊本」
  チェックボックス「宮崎」
  チェックボックス「鹿児島」
  チェックボックス「沖縄」

動作仕様
1.九州チェックをON
--->配下の福岡〜沖縄までのチェックをON
2.九州チェックをOFF
--->配下の福岡〜沖縄までのチェックをOFF
3.配下の福岡〜沖縄までのいずれかのチェックをOFF
--->九州チェックをOFF
4.配下の福岡〜沖縄までの全てのチェックをON
--->九州チェックをON

要は九州チェックがONの際は、配下の福岡〜沖縄までが併せて全てONになるし、
九州チェックがOFFの場合は、配下の福岡〜沖縄のいずれか、もしくは全てがOFFになっている状態。


以下、私が組んでみたコード

Public Class Form1

    Private flg As Integer  'チェックフラグ(0:すべて/1:九州のみ)

    Private Sub main()
        flg = 0
        AllChange(False)
    End Sub

    Private Sub kyushu_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles kyushu.CheckedChanged
        If flg = 0 Then
            If kyushu.Checked = True Then
                AllChange(True)
            Else
                AllChange(False)
            End If
        End If
    End Sub

    Private Sub AllChange(ByVal val As Boolean)
        hukuoka.Checked = val
        saga.Checked = val
        nagasaki.Checked = val
        ooita.Checked = val
        miyazaki.Checked = val
        kumamoto.Checked = val
        kagosima.Checked = val
        okinawa.Checked = val
    End Sub

    Private Sub hukuoka_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles hukuoka.CheckedChanged
        If hukuoka.Checked = True Then
            If (kumamoto.Checked = True) And _
               (saga.Checked = True) And _
               (ooita.Checked = True) And _
               (nagasaki.Checked = True) And _
               (miyazaki.Checked = True) And _
               (kagosima.Checked = True) And _
               (okinawa.Checked = True) Then

                kyushu.Checked = True
            End If

        Else
            flg = 1
            kyushu.Checked = False
            flg = 0
        End If
    End Sub

    Private Sub kumamoto_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles kumamoto.CheckedChanged
        If kumamoto.Checked = True Then
            If (hukuoka.Checked = True) And _
               (saga.Checked = True) And _
               (ooita.Checked = True) And _
               (nagasaki.Checked = True) And _
               (miyazaki.Checked = True) And _
               (kagosima.Checked = True) And _
               (okinawa.Checked = True) Then

                kyushu.Checked = True
            End If

        Else
            flg = 1
            kyushu.Checked = False
            flg = 0
        End If
    End Sub

    Private Sub saga_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles saga.CheckedChanged
        If saga.Checked = True Then
            If (kumamoto.Checked = True) And _
               (hukuoka.Checked = True) And _
               (ooita.Checked = True) And _
               (nagasaki.Checked = True) And _
               (miyazaki.Checked = True) And _
               (kagosima.Checked = True) And _
               (okinawa.Checked = True) Then

                kyushu.Checked = True
            End If

        Else
            flg = 1
            kyushu.Checked = False
            flg = 0
        End If
    End Sub

    Private Sub ooita_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ooita.CheckedChanged
        If ooita.Checked = True Then
            If (kumamoto.Checked = True) And _
               (saga.Checked = True) And _
               (hukuoka.Checked = True) And _
               (nagasaki.Checked = True) And _
               (miyazaki.Checked = True) And _
               (kagosima.Checked = True) And _
               (okinawa.Checked = True) Then

                kyushu.Checked = True
            End If

        Else
            flg = 1
            kyushu.Checked = False
            flg = 0
        End If
    End Sub

    Private Sub nagasaki_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nagasaki.CheckedChanged
        If nagasaki.Checked = True Then
            If (kumamoto.Checked = True) And _
               (saga.Checked = True) And _
               (ooita.Checked = True) And _
               (hukuoka.Checked = True) And _
               (miyazaki.Checked = True) And _
               (kagosima.Checked = True) And _
               (okinawa.Checked = True) Then

                kyushu.Checked = True
            End If

        Else
            flg = 1
            kyushu.Checked = False
            flg = 0
        End If
    End Sub

    Private Sub miyazaki_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles miyazaki.CheckedChanged
        If miyazaki.Checked = True Then
            If (kumamoto.Checked = True) And _
               (saga.Checked = True) And _
               (ooita.Checked = True) And _
               (nagasaki.Checked = True) And _
               (hukuoka.Checked = True) And _
               (kagosima.Checked = True) And _
               (okinawa.Checked = True) Then

                kyushu.Checked = True
            End If
        Else
            flg = 1
            kyushu.Checked = False
            flg = 0
        End If
    End Sub

    Private Sub kagosima_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles kagosima.CheckedChanged
        If kagosima.Checked = True Then
            If (kumamoto.Checked = True) And _
               (saga.Checked = True) And _
               (ooita.Checked = True) And _
               (nagasaki.Checked = True) And _
               (miyazaki.Checked = True) And _
               (hukuoka.Checked = True) And _
               (okinawa.Checked = True) Then

                kyushu.Checked = True
            End If
        Else
            flg = 1
            kyushu.Checked = False
            flg = 0
        End If
    End Sub

    Private Sub okinawa_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles okinawa.CheckedChanged
        If okinawa.Checked = True Then
            If (kumamoto.Checked = True) And _
               (saga.Checked = True) And _
               (ooita.Checked = True) And _
               (nagasaki.Checked = True) And _
               (miyazaki.Checked = True) And _
               (kagosima.Checked = True) And _
               (hukuoka.Checked = True) Then

                kyushu.Checked = True
            End If
        Else
            flg = 1
            kyushu.Checked = False
            flg = 0
        End If
    End Sub
End Class


当初は、配下の福岡〜沖縄までのチェックのON/OFF時に九州チェックも操作しているため、そこでまた配下の福岡〜沖縄までのチェックを操作しようとして変な動きになったりしていました。
そこでFLGを用いて制御したのですが、見てのとおり同じような処理が複数あり、もっと簡潔化できないかなと思った次第です。

こういったやり方もあるよ等、アドバイスをお願いします。

[ツリー表示へ]
タイトルRe: チェックボックスのONOFFの判定
記事No9310
投稿日: 2009/08/28(Fri) 14:28
投稿者太郎冠者
とりあえず各県のイベント処理をまとめてみました
hukuoka_CheckedChanged〜okinawa_CheckedChangedがPrefecturesInKyusyuRegion_CheckedChangedに
まとまっています。

------------ここからコード------------

Private flg As Integer  'チェックフラグ(0:すべて/1:九州のみ)

Private Sub main()
    flg = 0
    AllChange(False)
End Sub

'九州のCheckedChangedイベント
Private Sub kyushu_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles kyushu.CheckedChanged
    If flg = 0 Then
        If kyushu.Checked = True Then
            AllChange(True)
        Else
            AllChange(False)
        End If
    End If
End Sub

'九州地方の各県のCheckedChangedイベント
Private Sub PrefecturesInKyusyuRegion_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles hukuoka.CheckedChanged
    If AllChecked Then
        '全部ONならON
        kyushu.Checked = True
    Else
        '一つでもOFFならOFF
        flg = 1
        kyushu.Checked = False
        flg = 0
    End If
End Sub

Private Sub AllChange(ByVal val As Boolean)
    hukuoka.Checked = val
    saga.Checked = val
    nagasaki.Checked = val
    ooita.Checked = val
    miyazaki.Checked = val
    kumamoto.Checked = val
    kagosima.Checked = val
    okinawa.Checked = val
End Sub

'各県のチェックボックスのチェック状態をチェック
Private Function AllChecked(ByVal val As Boolean) As Boolean
    If hukuoka.Checked = True And _
       kumamoto.Checked = True And _
       saga.Checked = True And _
       ooita.Checked = True And _
       nagasaki.Checked = True And _
       miyazaki.Checked = True And _
       kagosima.Checked = True And _
       okinawa.Checked = True Then
      
       Return True
    Else
       Return False
    End IF
End Sub

------------ここまでコード------------

[ツリー表示へ]
タイトルRe^2: チェックボックスのONOFFの判定
記事No9311
投稿日: 2009/08/28(Fri) 14:48
投稿者ダンボ
> '九州地方の各県のCheckedChangedイベント
> Private Sub PrefecturesInKyusyuRegion_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles hukuoka.CheckedChanged

Handles hukuoka.CheckedChanged, kumamoto.CheckedChanged, saga.CheckedChanged, ooita.CheckedChanged, nagasaki.CheckedChanged, miyazaki.CheckedChanged, kagosima.CheckedChanged, okinawa.CheckedChanged

ですよね。

[ツリー表示へ]
タイトルRe^3: チェックボックスのONOFFの判定
記事No9312
投稿日: 2009/08/28(Fri) 15:21
投稿者太郎冠者
>Handles hukuoka.CheckedChanged, kumamoto.CheckedChanged, saga.CheckedChanged,
>ooita.CheckedChanged, nagasaki.CheckedChanged, miyazaki.CheckedChanged,
>kagosima.CheckedChanged, okinawa.CheckedChanged

あぅ、その通りです。
フォローありがとうございます。

[ツリー表示へ]
タイトルRe^4: チェックボックスのONOFFの判定
記事No9313
投稿日: 2009/08/28(Fri) 15:57
投稿者ちょぴ
各県のイベントをまとめるんですね。
見たら納得!ですが、発想できませんでした・・・。

まだまだ勉強不足です。

ちなみに、
>        If AllChecked Then
>            '全部ONならON
>            kyushu.Checked = True

は、

        If AllChecked(True) Then
            '全部ONならON
            kyushu.Checked = True

に修正して使用させていただきます。

本当に有難うございました。

[ツリー表示へ]
タイトルRe^5: チェックボックスのONOFFの判定
記事No9316
投稿日: 2009/08/28(Fri) 18:54
投稿者太郎冠者
>         If AllChecked(True) Then
>             '全部ONならON
>             kyushu.Checked = True
>
> に修正して使用させていただきます。

おぉっと、ごめんなさい
そこは、こっちの引数を削除して対応して下さい。
使ってないので・・・
× Private Function AllChecked(ByVal val As Boolean) As Boolean
○ Private Function AllChecked() As Boolean

#AllChange(ByVal val As Boolean)をコピペして削除し忘れましたorz

[ツリー表示へ]