检查在代码中创建的Label文本是否包含特定字符串

时间:2016-05-19 14:00:58

标签: vb.net visual-studio visual-studio-2012

我创建了几个标签和文本框,它们的数量取决于用户在文本框中键入的内容,即输入5个,因此会有5个标签和5个文本框。 我可以递归搜索所有名称为“myLabel”的标签。 var,var =本例中的数字1到5。 我有一个3项标签的上下文菜单。第1项将标签文本更改为用户想要的任何内容,数字,字母和/或符号。第2项和第3项是我遇到的麻烦。 第2项需要在第一次启动时将标签文本更改为D1,然后需要第二次将其更改为D2,如果第三次调用,则错误不应让它们继续。 项目3与2相同,除了文本应分别为S1和S2。 到目前为止我所拥有的是这个,但是我一直陷入循环,或者它没有将label.text更改为我想要的东西。任何帮助表示赞赏

Private Sub lblMenuItem3_Click()

    label = lblContextMenu.SourceControl.Name

    For Each control As Control In Me.Controls
        If TypeOf control Is Label Then
            Dim myLabel As Label = DirectCast(control, Label)
            Dim str As String = myLabel.Text
            'If myLabel.Text = "S1" Then
            If LCase(str).Contains(LCase("S1")) Then

                'MessageBox.Show("That string is in here!")
                Me.Controls.Item(label).Text = "S2"
            Else

                'MessageBox.Show("The string is not in here!")
                Me.Controls.Item(label).Text = "S1"
            End If
        Else
            Me.Controls.Item(label).Text = "S1"
            'End If
        End If
    Next

    'Me.Controls.Item(label).Text = "S1"
    'Me.Controls.Item(label).Text = "S2"
End Sub

EDIT1: 这段代码部分工作,因为我需要它,但由于某种原因它运行sub的次数等于表单上的标签数量,我不知道为什么

Private Sub lblMenuItem3_Click()

    label = lblContextMenu.SourceControl.Name

    Dim s1lbl As Boolean = False
    Dim s2lbl As Boolean = False
    For Each control As Control In Me.Controls
        If TypeOf control Is Label Then
            Dim myLabel As Label = DirectCast(control, Label)
            Dim str As String = myLabel.Text
            If LCase(str).Contains(LCase("S1")) Then
                s1lbl = True
                Exit For
            ElseIf LCase(str).Contains(LCase("S2")) Then
                s2lbl = True
                Exit For
            Else
                Continue For
            End If
        End If
    Next

    If s1lbl = False AndAlso s2lbl = False Then
        Me.Controls.Item(label).Text = "S1"
        Exit Sub
    End If
    If s1lbl = True AndAlso s2lbl = False Then
        Me.Controls.Item(label).Text = "S2"
        Exit Sub
    End If
    If s1lbl = False AndAlso s2lbl = True Then
        MessageBox.Show("Too many Shallow points, only 2 allowed.")
        Exit Sub
    End If

End Sub

这是代码:

    Private Sub TextBoxABPts_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBoxABPts.KeyPress
    For i = 1 To TextBoxABPts.Text
            lbl1 = New Label()
            lbl1.Location = New Point(2, 165 + 25 * (i - 1))
            lbl1.Name = "myLabel" & i
            lbl1.Text = i
            Me.Controls.Add(lbl1)


            AddHandler lblMenuItem1.Click, AddressOf lblMenuItem1_Click
            AddHandler lblMenuItem2.Click, AddressOf lblMenuItem2_Click
            AddHandler lblMenuItem3.Click, AddressOf lblMenuItem3_Click
            lblContextMenu.MenuItems.Add(lblMenuItem1)
            lblContextMenu.MenuItems.Add(lblMenuItem2)
            lblContextMenu.MenuItems.Add(lblMenuItem3)
            lbl1.ContextMenu = lblContextMenu

        Next i
        TextBoxABDist.Focus()
    End If

3 个答案:

答案 0 :(得分:1)

我认为这可以帮助你: 将您的菜单项添加到for循环外的lblContextMenu,您可以在其中创建lblContextMenu

    lblContextMenu.MenuItems.Add("click1", New System.EventHandler(AddressOf Me.lblMenuItem1_Click1))
    lblContextMenu.MenuItems.Add("click2", New System.EventHandler(AddressOf Me.lblMenuItem1_Click2))
    lblContextMenu.MenuItems.Add("click3", New System.EventHandler(AddressOf Me.lblMenuItem1_Click3))

然后在你的for循环中,只需将contextmenu添加到标签:

For i As Integer = 1 To TextBoxABPts.Text
        Dim lbl1 = New Label()
        lbl1.Location = New Point(2, 165 + 25 * (i - 1))
        lbl1.Name = "myLabel" & i
        lbl1.Text = i
        Me.Controls.Add(lbl1)
        lbl1.ContextMenu = lblContextMenu
    Next i.

然后作为示例,您的菜单点击子可能如下所示:

    Private Sub lblMenuItem1_Click1(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim mi As MenuItem = CType(sender, MenuItem)
    Dim menu As ContextMenu = mi.GetContextMenu()
    Dim lbl As Label = CType(menu.SourceControl, Label)
    lbl.Text = mi.Text
    End Sub

您需要将此与您当前的ifelse逻辑相结合。

答案 1 :(得分:1)

此:

If LCase(str).Contains(LCase("S1")) Then

    'MessageBox.Show("That string is in here!")
    Me.Controls.Item(label).Text = "S2"
Else

    'MessageBox.Show("The string is not in here!")
    Me.Controls.Item(label).Text = "S1"
End If

应该是这样的:

If LCase(str).Contains(LCase("S1")) Then

    'MessageBox.Show("That string is in here!")
    myLabel.Text = "S2"
ElseIf LCase(str).Contains(LCase("S2"))

    'MessageBox.Show("Bad Stuff!")
    ' Do your S3 error things here
Else
    'MessageBox.Show("No S Value Found!")
    myLabel.Text = "S1"
End If

如果没有ElseIf结构,您将在将其设置为S1或S2之间切换,并且没有其他选项。有了这个结构,你可以检查所有可能性,它不应该循环。

答案 2 :(得分:1)

您需要在方法中使用正确的签名。它看起来应该是这样的。

Label1_Click(sender As Object, e As EventArgs)

然后,您可以将发件人转换为标签并设置文本。

Ctype(sender, Label).Text = "S1"