簡體   English   中英

vb.net查找以表格中指定字符串開頭的控件

[英]vb.net find controls that begins with specified string in a form

我想列出所有以“ btn”開頭的按鈕的名稱,但是這些按鈕位於不同的面板中。 我腦子里有這個

dim obj() as object in frmForm.Controls.Find(True,"btn*")

但我認為這可能是錯誤的。

首先,第一個參數是名稱,第二個參數是bool ,它指示您是否要遞歸搜索。

第二,沒有內置的方法。 我將使用您自己的方法,如下所示:

Public Function FindControlStartsWith(root As Control, name As String, recursive As Boolean, comparison As StringComparison) As Control()
    If root Is Nothing Then
        Throw New ArgumentNullException("root")
    End If
    Dim controls = New List(Of Control)
    Dim stack = New Stack(Of Control)()
    stack.Push(root)

    While stack.Count > 0
        Dim c As Control = stack.Pop()
        If c.Name.StartsWith(name, comparison) Then
            controls.Add(c)
        End If
        If recursive Then
            For Each child As Control In root.Controls
                stack.Push(child)
            Next
        End If
    End While
    Return controls.ToArray()
End Function

以這種方式使用它:

Dim obj() As Control = FindControlStartsWith(Me, "BUT", True, StringComparison.OrdinalIgnoreCase)

我對控件的類型進行了類似的操作,但是可以很容易地對其名稱進行修改。 請嘗試以下代碼:

Private Sub findcontrols(ByVal root As Control)

    For Each cntrl As Control In root.Controls
        findcontrols(cntrl)
        If cntrl.name.startswith("btn") Then
            msgbox(cntrl.name)
        End If


End Sub

您可以通過為諸如控制遞歸之類的東西添加參數來使其更加復雜。 請記住,如果要使用它來處理任何特定於控件類型的東西(即控件中不從Control類繼承的任何東西),則需要將該對象CType作為適當的控件。 因此,如果.name僅在Button類中,而在Control類中不存在,則必須執行以下操作才能起作用:

msgbox(ctype(cntrl, Button).name)

我自己的個人版本看起來像這樣:

Private Sub clearcontrols(ByVal root As Control, ByVal ClearLists As Boolean, Optional ByVal ClearTabPages As Boolean = False)
    For Each cntrl As Control In root.Controls
        clearcontrols(cntrl, ClearLists, ClearTabPages)

        If TypeOf cntrl Is TextBox  Then
            CType(cntrl, TextBox).Clear()
        End If

        If TypeOf cntrl Is DataGridView Then
                CType(cntrl, DataGridView).Rows.Clear()
        End If

        If TypeOf cntrl Is ListBox   And ClearLists = True Then
                CType(cntrl, ListBox).Items.Clear()
        End If

        If TypeOf cntrl Is TabControl And ClearTabPages = True Then
            For Each tp As TabPage In CType(cntrl, TabControl).TabPages
                If DynTPList.Contains(tp.Name) Then
                    tp.Dispose()

                End If

            Next
        End If
    Next

End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM