プロが教える店舗&オフィスのセキュリティ対策術

現在、VB.NETのWINDOWSアプリケーションで開発しており、DBはSqlserver2005を使用しています。
フォームLoad時に、指定したテキストボックスやボタンをロックする(readonly)共通関数を作成しようと考えています。
そこで、どのように記述すればいいか教えて下さい。

(1)フォームロード時 共通関数LookControlを実行する際、引数にコントロール名を渡したいのですが、
 どのようにすればいいでしょうか?
 
Private Sub フォーム_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'テキストボックスの場合
Call LookControl(???, True) ←コントロール名の渡し方
'コンボボックスの場合
Call LookControl(???, True)
'ボタンの場合
Call LookControl(???, True)
End Sub

(2)共通関数LookControl
 どのコントロールが引数で渡されてもロックができる関数を作りたい。

 Module mod共通関数_表示
Public Sub LookControl(ByVal pControl As Control, ByVal pReadFlg As Boolean)
Dim Textbox As TextBoxBase
'Dim Combbox As ComboBox
'Dim Bottan As Button
Try
For Each cldControl As Control In pControl.Controls
If pControl.HasChildren = True Then
LookControl(cldControl, pReadFlg)
End If
'
Select Case True
Case TypeOf cldControl Is TextBoxBase
TextBox = DirectCast(cldControl, TextBoxBase)
TextBox.ReadOnly = pReadFlg
Case TypeOf cldControl Is ComboBox
            ???
Case TypeOf cldControl Is Button
            ???
End Select
Next
Catch oExcept As Exception
'例外が発生した時の処理
MessageBox.Show(oExcept.ToString, "例外発生")
End Try
End Sub
End Module

A 回答 (4件)

'よく考えたらIf文いらない気がする。


For Each cldControl As Control In pControl.Controls
LookControl(cldControl, pReadFlg)
Next
'後は俺がさっき言ったとおり
cldControl.Enabled = False
'ReadOnlyプロパティでなければならない理由があれば別だけど。
'TextBoxだろうが,ButtonだろうがControlを継承しているから
'全てがEnabledを持つはずで,分岐が不要なんでは?というのが#1の後半のお話

この回答への補足

できました。
迅速なお返事のおかげで、解決も早く本当に助かりました。
ありがとうございました。

補足日時:2008/08/26 16:07
    • good
    • 0

For Each cldControl As Control In pControl.Controls ←ここで処理が抜けてしまう


If pControl.HasChildren = True Then
LookControl(cldControl, pReadFlg)
End If
Next ' 試してないけどNextをここに持ってくるとどう?
Select Case True
Case TypeOf cldControl Is TextBoxBase
'*** TextBox ***
Textbox = DirectCast(cldControl, TextBoxBase)
Textbox.ReadOnly = pReadFlg
Case TypeOf cldControl Is ComboBox
'*** ComboBox ***
End Select
' ここのNextは削除
    • good
    • 0

Private Sub フォーム_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


Call LookControl(Me.Controls("TextBox1"), True) '←コントロール名の渡し方
End Sub

>文字列からControlインスタンスを得る方法
こっちを採用したんだけどこれじゃダメ?

#Windowsアプリケーションとして作らない場合は
#デフォルトが空文字列だったorz

この回答への補足

コントロール名の取得わかりました。
ですが、次のステップでまたつまづいてしまいました。
下記のところで抜けてしまい、テキストボックスの場合にreadonlyする処理が通りません。どうしてでしょうか?
Public Sub LookControl(ByVal pControl As Control, ByVal pReadFlg As Boolean)
Dim Textbox As TextBoxBase
Dim ComboBox As ComboBox
'*****
Try
For Each cldControl As Control In pControl.Controls ←ここで処理が抜けてしまう
If pControl.HasChildren = True Then
LookControl(cldControl, pReadFlg)
End If
'
Select Case True
Case TypeOf cldControl Is TextBoxBase
'*** TextBox ***
Textbox = DirectCast(cldControl, TextBoxBase)
Textbox.ReadOnly = pReadFlg
Case TypeOf cldControl Is ComboBox
'*** ComboBox ***
End Select
Next
Catch oExcept As Exception
'例外が発生した時の処理
MessageBox.Show(oExcept.ToString, "例外発生")
End Try
End Sub

補足日時:2008/08/26 14:40
    • good
    • 0

良く判らなかったんだけど


それはコントロール名を「文字列」で渡したいってことかな?(Or 文字列からControlインスタンスを得る方法)

もしそれで正しいのなら

一応
System.Windows.Forms.Form.Controlsを含むControl.Controls

Control.ControlCollectionで
http://msdn.microsoft.com/en-us/library/system.w …

例えばMeをSystem.Windows.Forms.Formインスタンスとして
Me.Controls("PictureBox1")とかでControlインスタンスそのものが得られると思う。

====================

>Select Case True
>Case TypeOf cldControl Is TextBoxBase
>TextBox = DirectCast(cldControl, TextBoxBase)
>TextBox.ReadOnly = pReadFlg
>Case TypeOf cldControl Is ComboBox
>Case TypeOf cldControl Is Button
>End Select

やりたいことは分からんでもないのだけれど
Control.Enabledじゃだめなの?
http://msdn.microsoft.com/en-us/library/system.w …

この回答への補足

早々の回答ありがとうございます。
>それはコントロール名を「文字列」で渡したいってことかな?
はい。
Private Sub フォーム_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Call LookControl("テキスト名", True)
End Sub
でしたいと思っています。
>System.Windows.Forms.Form.Controlsを含むControl.Controlsは
>Control.ControlCollectionで
>例えばMeをSystem.Windows.Forms.Formインスタンスとして
>Me.Controls("PictureBox1")とかでControlインスタンスそのものが>得られると思う。
すみません。まだVB.NETを始めたばかりの初心者なのでもう少し詳しく教えてもらえないでしょうか?
Public Sub LookControl(ByVal pControl As Control, ByVal pReadFlg As Boolean)
<共通モジュール>
End Sub
とした時の引数をどうしたらいいかわかりません。
よろしくお願いします。

補足日時:2008/08/26 13:12
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!