C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: パネル上のコントロールだけ非活性にする。


(過去ログ 126 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■74980 / inTopicNo.1)  パネル上のコントロールだけ非活性にする。
  
□投稿者/ 優希(ゆき) (50回)-(2015/02/16(Mon) 10:41:03)

分類:[VB.NET/VB2005 以降] 

2015/02/16(Mon) 10:41:56 編集(投稿者)
分類を間違えたので変更

開発環境:Win7
言語:.net2005

先日は、ありがとうございました。

今回は、参照ボタンを押下した場合に、タブコントロールの中のスクロールパネル上のパネル内のコントロールのみ非活性にしたいのですが、フォーム上のコントロールを全て取得する下記コードからパネル上のコントロールというのは振り分けできますでしょうか?

デザインではタブコントロール→スクロールパネル→パネル三層になっています。


   Public Shared Function CreateControlCollection(ByVal Container As Control) As Hashtable
        Dim Hash As New Hashtable

        Call AppendControlCollection(Container, Hash)

        Return Hash

    End Function

    Private Shared Sub AppendControlCollection(ByVal Container As Control, ByVal Hash As Hashtable)
        For Each oControl As Control In Container.Controls

            If oControl.Controls.Count > 0 Then
                Call AppendControlCollection(oControl, Hash)
            End If

            Hash(oControl.Name) = oControl

        Next

    End Sub

   Private Sub all()

        '全てのコントロールをハッシュテーブルに入れる。
        Dim MyControls As Hashtable = CreateControlCollection(Me)
        Dim oControl As Control
        'ハッシュテーブルの値をコントロールに変換する
        For Each oControl In MyControls.Values

            '非活性にする
            oControl.Enabled = False



        Next
    End Sub


引用返信 編集キー/
■74981 / inTopicNo.2)  Re[1]: パネル上のコントロールだけ非活性にする。
□投稿者/ Hongliang (280回)-(2015/02/16(Mon) 10:58:02)
Panelなどのコンテナコントロールの場合、そのコンテナコントロールのEnabledをfalseにすれば子孫コントロールのEnabledは自動的にfalseになりますよ?
// コンテナコントロール内の一部のコントロールだけ有効にしたいなら、個々のコントロールのEnabledをfalseにしたりとかコンテナコントロールの子にしないようにしたりとかが必要ですが。
引用返信 編集キー/
■74982 / inTopicNo.3)  Re[1]: パネル上のコントロールだけ非活性にする。
□投稿者/ キム (50回)-(2015/02/16(Mon) 10:58:36)
No74980 (優希(ゆき) さん) に返信

パネル自体を非活性にすれば、パネル内の全コントロールが非活性になりますが、それではだめですか?
引用返信 編集キー/
■74983 / inTopicNo.4)  Re[2]: パネル上のコントロールだけ非活性にする。
□投稿者/ キム (51回)-(2015/02/16(Mon) 11:00:46)
ごめんなさい、Hongliangさんの発言と被ってしまいました。
引用返信 編集キー/
■74984 / inTopicNo.5)  Re[1]: パネル上のコントロールだけ非活性にする。
□投稿者/ shu (690回)-(2015/02/16(Mon) 11:50:42)
No74980 (優希(ゆき) さん) に返信

こんな感じでしょうか?
スクロールパネルとかスクロールパネルに直載っているものは対象になりませんが
大丈夫でしょうか?

For Each pnl1 in スクロールパネル.Controls.OfType(Of Panel)
    For Each CL in pnl1.Controls
        Select Case True
            Case 非活性化条件
                CL.Enabled = False
        End Select
または
    CL.Enabled = Not Func非活性化条件(CL)
    Next
Next


引用返信 編集キー/
■74985 / inTopicNo.6)  Re[2]: パネル上のコントロールだけ非活性にする。
□投稿者/ 優希(ゆき) (51回)-(2015/02/16(Mon) 13:06:10)
No74982 (キム さん) に返信
No74981 (Hongliang さん) に返信

ありがとうございます。

パネルを非活性にすると、子コントロールが非活性になうことは確認しました。

また、この方法だと、Panelが非活性の場合はその子コントロールを活性にしても変わらないのは仕様になりますか?
引用返信 編集キー/
■74986 / inTopicNo.7)  Re[2]: パネル上のコントロールだけ非活性にする。
□投稿者/ 優希(ゆき) (52回)-(2015/02/16(Mon) 13:19:46)
No74984 (shu さん) に返信
> ■No74980 (優希(ゆき) さん) に返信
>
> こんな感じでしょうか?
> スクロールパネルとかスクロールパネルに直載っているものは対象になりませんが
> 大丈夫でしょうか?
>
> For Each pnl1 in スクロールパネル.Controls.OfType(Of Panel)
> For Each CL in pnl1.Controls
> Select Case True
> Case 非活性化条件
> CL.Enabled = False
> End Select
> または
>     CL.Enabled = Not Func非活性化条件(CL)
> Next
> Next
>
>

これだと、パネル上のコントロールが対象にならないのでちょっと違いますね。

引用返信 編集キー/
■74987 / inTopicNo.8)  Re[3]: パネル上のコントロールだけ非活性にする。
□投稿者/ Hongliang (281回)-(2015/02/16(Mon) 13:37:36)
> また、この方法だと、Panelが非活性の場合はその子コントロールを活性にしても変わらないのは仕様になりますか?
はい。
引用返信 編集キー/
■74988 / inTopicNo.9)  Re[4]: パネル上のコントロールだけ非活性にする。
□投稿者/ 優希(ゆき) (53回)-(2015/02/16(Mon) 13:47:37)
No74987 (Hongliang さん) に返信
>>また、この方法だと、Panelが非活性の場合はその子コントロールを活性にしても変わらないのは仕様になりますか?
> はい。


ということは、パネル上の子コントロールを制御する場合は個別にやらないといけないということですね。

これで、情報は出揃ったので一旦この内容でコーディングしていきます。

また、何かあったら教えて下さい。


引用返信 編集キー/
■74990 / inTopicNo.10)  Re[3]: パネル上のコントロールだけ非活性にする。
□投稿者/ shu (691回)-(2015/02/16(Mon) 15:36:23)
No74986 (優希(ゆき) さん) に返信
> これだと、パネル上のコントロールが対象にならないのでちょっと違いますね。
>
よく見て欲しいのですがネストになってます。
のでパネル上の直下のコントロールだけが対象となります。
スクロールパネル上の他のコントロールが対象になるのでしたら外ループのOfTypeをはずし
条件判定をするようにしてみて下さい。
逆にさらにパネル内にコンテナコントロールがある場合はさらにネストループが必要です。
引用返信 編集キー/
■75031 / inTopicNo.11)  Re[4]: パネル上のコントロールだけ非活性にする。
□投稿者/ 優希(ゆき) (57回)-(2015/02/20(Fri) 09:54:07)
Hongliangさん、キムさん、shuさん

回答有難うございました。

パネルでは問題ありと言われたため、パネル上のコントロールを検索して、
処理を行うことにしました。
また、テキストボックス等は読み取り専用ですることとの事でしたので、
キャストして、読み取り専用にしました。

次回もよろしくお願いします。

   Private Sub Control_Reference()

        '全てのコントロールをハッシュテーブルに入れる。
        Dim MyControls As Hashtable = CreateControlCollection(Me)
        Dim oControl As Control

        Try



            'ハッシュテーブルの値をコントロールに変換する
            For Each oControl In MyControls.Values
                '下記コントールを探す。
                If oControl.GetType Is GetType(独自コントロール名) Or oControl.GetType Is GetType(独自コントロール名) Or oControl.GetType Is GetType(独自コントロール名) Or oControl.GetType Is GetType(独自コントロール名) _
                Or oControl.GetType Is GetType(CheckBox) Or oControl.GetType Is GetType(Button) Or oControl.GetType Is GetType(RadioButton) Then

                    'テキストボックスか否か
                    If TryCast(oControl, 独自コントロール名) IsNot Nothing Then

                        DirectCast(oControl, 独自コントロール名).ReadOnly = True

                    ElseIf TryCast(oControl, 独自コントロール名) IsNot Nothing Then

                        DirectCast(oControl, 独自コントロール名).ReadOnly = True

                    ElseIf TryCast(oControl, 独自コントロール名) IsNot Nothing Then

                        DirectCast(oControl, 独自コントロール名).ReadOnly = True

                    ElseIf TryCast(oControl, 独自コントロール名) IsNot Nothing Then

                        DirectCast(oControl, 独自コントロール名).ReadOnly = True

                        'ラジオボタンかチェックボックスか否か
                    ElseIf TryCast(oControl, RadioButton) IsNot Nothing Or TryCast(oControl, CheckBox) IsNot Nothing Then

                        If TryCast(oControl, RadioButton) IsNot Nothing Then

                            DirectCast(oControl, RadioButton).AutoCheck = False

                        Else

                            DirectCast(oControl, CheckBox).AutoCheck = False

                        End If

                    ElseIf TryCast(oControl, Button) IsNot Nothing Then

                        DirectCast(oControl, Button).Enabled = False

                    ElseIf TryCast(oControl, DataGridViewPlus) IsNot Nothing Then

                        DirectCast(oControl, DataGridViewPlus).ReadOnly = False

                    Else

                        oControl.Enabled = False


                    End If

                End If

            Next


            'ボタンは全て非活性にしているので、しないものは解除する
            btn_Tbpage1.Enabled = True
            btn_Tbpage2.Enabled = True
            btn_Tbpage3.Enabled = True
            btn_Tbpage4.Enabled = True
            btn_Tbpage5.Enabled = True
            btn_Tbpage6.Enabled = True
            btn_Tbpage7.Enabled = True
            btn_close.Enabled = True
            btn_His.Enabled = True






        Catch ex As Exception
            ''--------------------
            '' エラーハンドリング
            ''--------------------
            Call gsub_ErrorHandring(ex)

        End Try
    End Sub


※独自コントロール名は伏せさせていただきました。


引用返信 編集キー/
■75032 / inTopicNo.12)  Re[5]: パネル上のコントロールだけ非活性にする。
□投稿者/ shu (693回)-(2015/02/20(Fri) 10:07:34)
No75031 (優希(ゆき) さん) に返信

For Each直下は

If TypeOf oControl is ControlType1 Then
    DirectCast(oControl, TypeControl1).ReadOnly = True
ElseIf TypeOf oControl is ControlType2 Then
    DirectCast(oControl, TypeControl2).ReadOnly = True
・・・
End If

の方がすっきりします。


また独自コントロールにこの制御用にインターフェースを実装するともっとすっきり
すると思います。

提示コードのIf条件はOrではなくOrElseを推奨します。



引用返信 編集キー/
■75047 / inTopicNo.13)  Re[6]: パネル上のコントロールだけ非活性にする。
□投稿者/ 優希(ゆき) (58回)-(2015/02/23(Mon) 11:43:59)
No75032 (shu さん) に返信
> ■No75031 (優希(ゆき) さん) に返信
>
> For Each直下は
>
> If TypeOf oControl is ControlType1 Then
> DirectCast(oControl, TypeControl1).ReadOnly = True
> ElseIf TypeOf oControl is ControlType2 Then
> DirectCast(oControl, TypeControl2).ReadOnly = True
> ・・・
> End If
>
> の方がすっきりします。
>
>
> また独自コントロールにこの制御用にインターフェースを実装するともっとすっきり
> すると思います。
>
> 提示コードのIf条件はOrではなくOrElseを推奨します。
>
>

こちらのほうがコード的にはスッキリしました。
shuさんありがとうございました。

これで解決済みとさせていただきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -