根据名称中的文本查找标签名称

时间:2021-04-10 12:00:26

标签: vb.net

我不确定这是否可行,但它会有所帮助:我有相当大的标签网格,并希望根据名称中的单词更改它们的可见性,例如查找标签列表所有名称中都包含“Twentytwo”并将其可见性设置为 false

2 个答案:

答案 0 :(得分:0)

这是一个基于 Control.GetNextControl 的解决方案:

    Const textToSearch = "Twentytwo" 'Text to search

    Dim c As Control = Me.GetNextControl(Me, True)
    Do Until c Is Nothing
        'Check if c is label and its name contains "textToSearch"
        If TypeOf c Is Label AndAlso c.Name.Contains(textToSearch) Then
            c.Visible = False 'Hide this label
        End If
        c = Me.GetNextControl(c, True)
    Loop

如果您想在标签文本中而不是在其名称中搜索“Twentytwo”,请将 c.Name.Contains 替换为 c.Text.Contains

答案 1 :(得分:0)

假设您的标签都在一个容器中,也许是一个面板。

此外,假设您只希望指定标签具有 .Visible = False,因此可见性只是标签名称是否包含给定字符串。

您可以选择特定类型的控件,这样在使用之前无需检查控件的类型,如下所示:

Sub SetLabelVisibility(container As Control, namePart As String)
    container.SuspendLayout()

    For Each lbl In container.Controls.OfType(Of Label)
        lbl.Visible = lbl.Name.Contains(namePart)
    Next

    container.ResumeLayout()

End Sub

你会用

SetLabelVisibility(Panel1, "Twentytwo")

在更新其子控件时暂停容器的布局是为了一次性完成它的显示。


在表单上使用适当大小的面板进行演示:

Labels being made visible and invisible

Public Class Form1

    Dim tim As New Timer With {.Interval = 1000}

    Sub CreateLabels(target As Panel)
        For j = 0 To 6
            For i = 0 To 4
                Dim lbl = New Label With {
                                    .Name = $"Label{j}_{i}",
                                    .BackColor = Color.BlanchedAlmond,
                                    .Text = i & j,
                                    .Location = New Point(j * 40, i * 20),
                                    .Size = New Size(38, 18),
                                    .TextAlign = ContentAlignment.MiddleCenter
                                }

                target.Controls.Add(lbl)
            Next
        Next

    End Sub

    Sub SetLabelVisibility(container As Control, namePart As String)
        container.SuspendLayout()

        For Each lbl In container.Controls.OfType(Of Label)
            lbl.Visible = lbl.Name.Contains(namePart)
        Next

        container.ResumeLayout()

    End Sub

    Sub ChangeVisibleLabels(sender As Object, e As EventArgs)
        Static n As Integer = 0
        SetLabelVisibility(Panel1, n.ToString())
        n = (n + 1) Mod 7

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        CreateLabels(Panel1)

        AddHandler tim.Tick, AddressOf ChangeVisibleLabels
        tim.Start()

    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        If tim IsNot Nothing Then
            RemoveHandler tim.Tick, AddressOf ChangeVisibleLabels
            tim.Dispose()
        End If

    End Sub

End Class
Public Class Form1

    Dim tim As New Timer With {.Interval = 1000}

    Sub CreateLabels(target As Panel)
        For j = 0 To 6
            For i = 0 To 4
                Dim lbl = New Label With {
                                    .Name = $"Label{j}_{i}",
                                    .BackColor = Color.BlanchedAlmond,
                                    .Text = i & j,
                                    .Location = New Point(j * 40, i * 20),
                                    .Size = New Size(38, 18),
                                    .TextAlign = ContentAlignment.MiddleCenter
                                }

                target.Controls.Add(lbl)
            Next
        Next

    End Sub

    Sub SetLabelVisibility(container As Control, namePart As String)
        container.SuspendLayout()

        For Each lbl In container.Controls.OfType(Of Label)
            lbl.Visible = lbl.Name.Contains(namePart)
        Next

        container.ResumeLayout()

    End Sub

    Sub ChangeVisibleLabels(sender As Object, e As EventArgs)
        Static n As Integer = 0
        SetLabelVisibility(Panel1, n.ToString())
        n = (n + 1) Mod 7

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        CreateLabels(Panel1)

        AddHandler tim.Tick, AddressOf ChangeVisibleLabels
        tim.Start()

    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        If tim IsNot Nothing Then
            RemoveHandler tim.Tick, AddressOf ChangeVisibleLabels
            tim.Dispose()
        End If

    End Sub

End Class
Public Class Form1

    Dim tim As New Timer With {.Interval = 1000}

    Sub CreateLabels(target As Panel)
        For j = 0 To 6
            For i = 0 To 4
                Dim lbl = New Label With {
                                    .Name = $"Label{j}_{i}",
                                    .BackColor = Color.BlanchedAlmond,
                                    .Text = i & j,
                                    .Location = New Point(j * 40, i * 20),
                                    .Size = New Size(38, 18),
                                    .TextAlign = ContentAlignment.MiddleCenter
                                }

                target.Controls.Add(lbl)
            Next
        Next

    End Sub

    Sub SetLabelVisibility(container As Control, namePart As String)
        container.SuspendLayout()

        For Each lbl In container.Controls.OfType(Of Label)
            lbl.Visible = lbl.Name.Contains(namePart)
        Next

        container.ResumeLayout()

    End Sub

    Sub ChangeVisibleLabels(sender As Object, e As EventArgs)
        Static n As Integer = 0
        SetLabelVisibility(Panel1, n.ToString())
        n = (n + 1) Mod 7

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        CreateLabels(Panel1)

        AddHandler tim.Tick, AddressOf ChangeVisibleLabels
        tim.Start()

    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        If tim IsNot Nothing Then
            RemoveHandler tim.Tick, AddressOf ChangeVisibleLabels
            tim.Dispose()
        End If

    End Sub

End Class