【问题标题】:Finding control in a Panel within a panel在面板中的面板中查找控件
【发布时间】:2014-09-11 18:50:33
【问题描述】:

我在 vb.net 中有这样的表格...

有一个名为“pnlResults”的外部面板,在该面板内我还有另外 10 个面板。 如图所示,每个面板中都有带有“名称”文本的标签。

我想通过循环访问这些标签,但是我尝试了以下操作但没有成功。

For Each ctrl As Control In Me.Controls
    If TypeOf ctrl Is Label Then
        If ctrl.Name.StartsWith("lblName") Then
            'Found the labels
        End If
    End If
Next

我要查找的所有标签的名称都以“lblName”开头,然后分别在“lblname”之后购买从 1 到 10 的数字,即“lblName1”等一直到 10

我相信这是因为面板是它自己的容器,因此被排除在“me.controls”循环之外。我该如何解决这个问题?

【问题讨论】:

  • 这是 ASP.NET 还是 WebForms?
  • vb.net 我确实在标题中有它,但它被删掉了 t.t
  • VB.NET 只是语言。它是 Web 项目还是桌面项目?
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 学校桌面项目

标签: vb.net winforms


【解决方案1】:

使用递归

Private Sub findingAcontrol(ByRef panelx As Panel)
    For Each Control As Control In panelx.Controls
        If TypeOf Control Is Panel Then
            Me.findingAcontrol(Control)
            Exit Sub
        End If
        If Control.Name = "Button3" Then
            MessageBox.Show(Control.Text)
        End If
    Next
End Sub

添加一个按钮并调用您的函数。例如:

Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
    For Each Control As Control In Me.Controls
        If TypeOf Control Is Panel Then
            Me.findingAcontrol(Control)
            Exit Sub
        End If
    Next
End Sub

【讨论】:

    【解决方案2】:

    这是另一种解决方案。您的想法是正确的,因为内部面板也是您的代码在其中找不到控件的容器。

    这个解决方案只是简单地进入一个级别,一旦它找到一个内部面板,就会根据你经历过多少个内部面板来找到标签。

    更新:我以为这是一个网络应用程序。这是您可以使用 Windows 窗体执行的操作的示例。

    Dim i As New Integer
    i = 0
    For Each ctr As Control In pnlResults.Controls
        If TypeOf ctr Is Panel Then
            i += 1
            Dim lblName As New Label
            lblName = ctr.Controls.Find("lblName" + i.ToString(), False)(0)
            'Do something
        End If
    Next
    

    保留 Web 应用程序的代码以防万一:

    Dim i As New Integer
    i = 0
    For Each ctr As Control In pnlResults.Controls
        If TypeOf ctr Is Panel Then
            i += 1
            Dim lblName As New Label
            lblName = ctr.FindControl("lblName" + i.ToString())
            'Do something
        End If
    Next
    

    【讨论】:

    • 您应该记录 FindControl 是什么。这不是标准功能。
    • @LarsTech,好收获!我以为这是一个没有验证标签的 Web 应用程序。
    【解决方案3】:

    仅在面板的控件集合中搜索面板。

    For Each pl As Panel In pnlResults.Controls.OfType(Of Panel)()
       For i As Integer = 1 To 10
        Dim lb As Label = pl.Controls("lblName" & i.ToString) 'is the label
       Next
    Next
    

    【讨论】:

    • 这将只返回该面板中所有面板的名称。我将不得不再次向下层级执行此操作?
    • 我得到一个错误'Control' is not a member of 'system.Windows.Form.Panel' under pl.Control
    猜你喜欢
    • 1970-01-01
    • 2013-07-18
    • 2013-03-16
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多