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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.64910 の関連記事表示

<< 0 >>
■64910  VB.NetでModuleからボタンを操作したい
□投稿者/ MP枯渇ウィザード -(2013/01/22(Tue) 11:47:59)

    分類:[.NET 全般] 

    お世話になります。

    具体的にはアプリの設定画面が20枚あり、その20枚の中ではボタン操作は
    全て共通、セーブボタンを押したときにセーブ処理が終わるまでボタンを
    無効にして、セーブ処理終了後にボタンを有効にする処理を作っています。

    Public Sub DataSeve()
    Func1Button.Enabled = False
    Func2Button.Enabled = False
    Func3Button.Enabled = False
    Func4Button.Enabled = False
    Func5Button.Enabled = False
    Func6Button.Enabled = False
    Func7Button.Enabled = False
    Func8Button.Enabled = False
    Func9Button.Enabled = False
    Func10Button.Enabled = False

    (セーブ処理)

    Func1Button.Enabled = True
    Func2Button.Enabled = True
    Func3Button.Enabled = True
    Func4Button.Enabled = True
    Func5Button.Enabled = True
    Func6Button.Enabled = True
    Func7Button.Enabled = True
    Func8Button.Enabled = True
    Func9Button.Enabled = True
    Func10Button.Enabled = True

    End Sub

    Module内にFuncXButtonがあるわけではないので、エラーが出てしまいます。
    かといって

    Select Case Disp
    Case Disp1:
    Disp1.Func〜〜〜
    Case Disp2:
    Disp2.Func〜〜〜

    と延々書くのも違うような気がするのですが、上手い記述方法があれば教示ください。
    お願いします。
親記事 /過去ログ109より / 関連記事表示
削除チェック/

■64915  Re[1]: VB.NetでModuleからボタンを操作したい
□投稿者/ shu -(2013/01/22(Tue) 12:53:36)
    No64910 (MP枯渇ウィザード さん) に返信
    
    案1)ボタンだけのフォームを作りそこから派生させる。
    案2)ボタン部分をユーザーコントロールにする
    案3)制御用のコンポーネントを作成する。
    
    
    案3のコンポーネントについて書きます。
    新規追加でコンポーネントを追加します。
    Designer.vbファイルはそのままで
    vbファイルを例えば以下のように記述します。
    Imports System.ComponentModel
    
    <ProvideProperty("FuncNo", GetType(Windows.Forms.Control))> _
    Public Class Component1
        Implements IExtenderProvider
    
        Friend ButtonNo As New Dictionary(Of Button, String)
    
        Public Function CanExtend(extendee As Object) As Boolean Implements System.ComponentModel.IExtenderProvider.CanExtend
            If TypeOf extendee Is Button Then
                Return True
            Else
                Return False
            End If
        End Function
    
        Public Function GetFuncNo(ByVal ctrl As Windows.Forms.Control) As String
            If Not TypeOf ctrl Is Button Then Return Nothing
            Dim btn = DirectCast(ctrl, Button)
            Dim ret As String = Nothing
            If ButtonNo.TryGetValue(btn, ret) Then
                Return ret
            Else
                Return Nothing
            End If
        End Function
    
        Public Sub SetFuncNo(ByVal ctrl As Windows.Forms.Control, ByVal value As String)
            If Not TypeOf ctrl Is Button Then Exit Sub
            Dim btn = DirectCast(ctrl, Button)
            If String.IsNullOrEmpty(value) Then
                If ButtonNo.ContainsKey(btn) Then
                    ButtonNo.Remove(btn)
                End If
            Else
                ButtonNo(btn) = value
            End If
        End Sub
    
        Public Property Enabled As Boolean
            Get
                If ButtonNo.Count > 0 Then
                    Return ButtonNo.Keys(0).Enabled
                Else
                    Return False
                End If
            End Get
            Set(value As Boolean)
                For Each btnNo In ButtonNo
                    btnNo.Key.Enabled = value
                Next
            End Set
        End Property
    End Class
    
    一度コンパイルします。
    するとフォームデザイン状態でツールボックスから作成したComponent1を選ぶことが出来るようになります。
    Component1をフォームに貼りつけると
    各ButtonコントロールにToolTipのような拡張プロパティ『Component11のFuncNo』というのが表示されるので
    そこに適当に文字を入力します。Func1Buttonなら1など。
    後はコード上でComponent11.EnabledをTrue,Falseに変えるとFuncNoを設定したButtonのEnabledがすべて変わります。
    
    
記事No.64910 のレス /過去ログ109より / 関連記事表示
削除チェック/

■64934  Re[2]: VB.NetでModuleからボタンを操作したい
□投稿者/ MP枯渇ウィザード -(2013/01/23(Wed) 13:38:23)
    No64915 (shu さん) に返信

    ありがとうございます。
    コンポーネントを作るのですか。
    なるほど勉強になります。
    見た目はどの画面でも同じなので、現状案1っぽいものになっています。
    (Function.vbにページ名、時計、ボタンを配置、他の画面はすべて
    Function.vbを継承、標準機能以外が必要なところではボタンの機能を
    オーバーライドしている)
    そんな状態でも(Functionのボタンが使われているのと、独自機能で
    ボタンが上書きされているのが混在している)上記機能は記述できるのでしょうか?


    > ■No64910 (MP枯渇ウィザード さん) に返信
    >
    > 案1)ボタンだけのフォームを作りそこから派生させる。
    > 案2)ボタン部分をユーザーコントロールにする
    > 案3)制御用のコンポーネントを作成する。
    >
    >
    > 案3のコンポーネントについて書きます。
    > 新規追加でコンポーネントを追加します。
    > Designer.vbファイルはそのままで
    > vbファイルを例えば以下のように記述します。
    > Imports System.ComponentModel
    >
    > <ProvideProperty("FuncNo", GetType(Windows.Forms.Control))> _
    > Public Class Component1
    > Implements IExtenderProvider
    >
    > Friend ButtonNo As New Dictionary(Of Button, String)
    >
    > Public Function CanExtend(extendee As Object) As Boolean Implements System.ComponentModel.IExtenderProvider.CanExtend
    > If TypeOf extendee Is Button Then
    > Return True
    > Else
    > Return False
    > End If
    > End Function
    >
    > Public Function GetFuncNo(ByVal ctrl As Windows.Forms.Control) As String
    > If Not TypeOf ctrl Is Button Then Return Nothing
    > Dim btn = DirectCast(ctrl, Button)
    > Dim ret As String = Nothing
    > If ButtonNo.TryGetValue(btn, ret) Then
    > Return ret
    > Else
    > Return Nothing
    > End If
    > End Function
    >
    > Public Sub SetFuncNo(ByVal ctrl As Windows.Forms.Control, ByVal value As String)
    > If Not TypeOf ctrl Is Button Then Exit Sub
    > Dim btn = DirectCast(ctrl, Button)
    > If String.IsNullOrEmpty(value) Then
    > If ButtonNo.ContainsKey(btn) Then
    > ButtonNo.Remove(btn)
    > End If
    > Else
    > ButtonNo(btn) = value
    > End If
    > End Sub
    >
    > Public Property Enabled As Boolean
    > Get
    > If ButtonNo.Count > 0 Then
    > Return ButtonNo.Keys(0).Enabled
    > Else
    > Return False
    > End If
    > End Get
    > Set(value As Boolean)
    > For Each btnNo In ButtonNo
    > btnNo.Key.Enabled = value
    > Next
    > End Set
    > End Property
    > End Class
    >
    > 一度コンパイルします。
    > するとフォームデザイン状態でツールボックスから作成したComponent1を選ぶことが出来るようになります。
    > Component1をフォームに貼りつけると
    > 各ButtonコントロールにToolTipのような拡張プロパティ『Component11のFuncNo』というのが表示されるので
    > そこに適当に文字を入力します。Func1Buttonなら1など。
    > 後はコード上でComponent11.EnabledをTrue,Falseに変えるとFuncNoを設定したButtonのEnabledがすべて変わります。
    >
    >
記事No.64910 のレス /過去ログ109より / 関連記事表示
削除チェック/

■65062  Re[3]: VB.NetでModuleからボタンを操作したい
□投稿者/ MP枯渇ウィザード -(2013/01/31(Thu) 17:58:20)
    いろいろ調べた結果、時間の都合で全フォーム力押しになりました。
    ただ、次回は楽してプログラミングしたいので、他にも挙がっていた方法も
    勉強してみます。
    ありがとうございました。
記事No.64910 のレス / END /過去ログ109より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -