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

コントロール検索

  • 題名: コントロール検索
  • 著者: クリリン
  • 日時: 2003/06/27 15:33:41
  • ID: 89
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
分類:[.NET]

このサイトには大変お世話になっております。初めて投稿させていただきますが、よろしくお願いします。
現在、コントロールを配列管理する為に色々と試行錯誤中なのですが、そこで感じたのが、タイトル通りコントロール検索のメゾットが無いのです。
ただ、配列にするだけならば、下記の方法で出来ます。
------------------------------------------------------------
Dim Ctrl() As System.Windows.Forms.Control
Dim intIdx As Integer
Dim ctrlCount As Integer = Me.Controls.Count
ReDim Ctrl(ctrlCount - 1)

For intIdx = 0 To CtrlCount - 1
    Ctrl(intIdx) = Me.Controls.Item(ctrlCount - 1 - intIdx)
Next
------------------------------------------------------------
しかし、これでは、コントロールを作成した順番になってしまいます。
そこで考えたのが、コントロール検索です。Delphiでは[FindControl]というメゾットが有るらしく、コントロール名(string型)を引数にするといいそうです。
話が長くなってしまいましたが、結局、.NETには[FindControl]のようなメゾットはあるのでしょうか?ないのでしょうか?
無ければ、自分で創ろうと思っています。
多分、皆さんも、以前のVBのようなコントロール配列がやりたいと思っているはずです。デザイン上ではしょうがないとしても、せめて内部で配列管理したいと…

みなさん、良きアドバイスをお願いします。
2003/07/02(Wed) 11:35:16 編集(投稿者)

自力で作成しました。サンプルを載せておきます。

GroupBoxやPanel等を使った階層が深くなるコントロールも探せます。
----------------------------------------------------------------------
Private Const TextBoxCount As Integer = 13      '13個の配列を作成
Private Const TextBoxName As String = "TextBox" 'デザインで使用している名称
Private TextBox(TextBoxCount - 1) As System.Windows.Forms.TextBox

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim Ctrl As System.Windows.Forms.Control
    Dim intIdx As Integer

    For intIdx = 0 To TextBox.Length - 1
        Ctrl = FindControl(Me, TextBoxName & intIdx + 1)
        If IsNothing(Ctrl) = False Then
            '配列に対し設定
            TextBox(intIdx) = CType(Ctrl, TextBox)
            TextBox(intIdx).Text = ""
            'イベントハンドラに関連付け
            AddHandler TextBox(intIdx).GotFocus, AddressOf Me.TextBox_GotFocus
            AddHandler TextBox(intIdx).LostFocus, AddressOf Me.TextBox_LostFocus
        End If
    Next
End Sub

Private Sub TextBox_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim index As Integer = System.Array.IndexOf(TextBox, sender)
    TextBox(index).BackColor = Color.LightCyan
End Sub

Private Sub TextBox_LostFocus(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim index As Integer = System.Array.IndexOf(TextBox, sender)
    TextBox(index).BackColor = Color.White
End Sub

--- 以下モジュールにしても可能 ---
Public Function FindControl(ByVal ParentsCtrl As System.Windows.Forms.Control, ByVal FindCtrlName As String) As System.Windows.Forms.Control
    Dim FindCtrl As System.Windows.Forms.Control
    
    If SearchCtrl(ParentsCtrl, FindCtrlName, FindCtrl) = True Then
        Return FindCtrl
    End If
End Function

Private Function SearchCtrl(ByVal ParentsCtrl As System.Windows.Forms.Control, ByVal FindCtrlName As String, ByRef FindCtrl As System.Windows.Forms.Control) As Boolean
    Dim Ctrl As System.Windows.Forms.Control
    Dim CtrlCount As Integer = ParentsCtrl.Controls.Count
    Dim intIdx As Integer

    SearchCtrl = False

    For intIdx = 0 To CtrlCount - 1
        '子コントロール検査
        Ctrl = ParentsCtrl.Controls.Item(intIdx)
        If FindCtrlName = Ctrl.Name Then
            SearchCtrl = True
            FindCtrl = Ctrl
            Exit Function
        Else
            If Ctrl.Controls.Count > 0 Then
                '再帰処理
                If SearchCtrl(Ctrl, FindCtrlName, FindCtrl) = True Then
                    SearchCtrl = True
                    Exit Function
                End If
            End If
        End If
    Next
End Function
解決済み!

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