2016-05-19 4 views
1

ラベルとテキストボックスがいくつか作成されていますが、それらは5つのラベルと5つのテキストボックスがあるように、 この例では、名前が "myLabel" & var、var = 1〜5のすべてのラベルを再帰的に検索できます。 私が持っているものは、3項目のラベルのコンテキストメニューです。項目1は、ユーザが所望するもの、数字、文字、および/または記号にラベルテキストを変更する。アイテム2と3は私が問題を抱えているものです。 アイテム2は、ラベルテキストを最初に開始するときにD1に変更する必要があります.2回目にラベルテキストをD2に変更する必要があります.3回目の呼び出しが呼び出された場合、エラーは継続できません。 項目3は、テキストがそれぞれS1とS2であることを除いて、2と同じです。 私はこれまでに何をしてきましたか?しかし、私はループで立ち往生し続けています。あるいは、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:このコードは、部分的に私はそれを必要とするが、何らかの理由でそれがサブに、フォーム上のラベルの数と同じ回数だけ実行され、私はとして働いている わからない理由

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 
+0

lblMenuItem3_Click()が発生しているコードを表示できる場合は役立ちます。 – Neal

+0

@Nealラベル作成用のコードであり、メニュー項目の追加ハンドラーです。ボタン内にあります。 –

+0

lblContextMenuは各lbl1に対して新規に作成されていません。試してみるか、毎回それを追加した後にMenuItemをクリアするか、毎回forループの中で新しいものを作成してください。 – Neal

答えて

1

私は、これはあなたを助けるべきだと思う: lblContextMenu OUにあなたのメニュー項目を追加します。あなたは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ループtside:

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ロジックと組み合わせる必要があります。

+0

これは、明白で容易なように –

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として設定間を行き来し、他のオプションはありません。構造体を配置すると、すべての可能性がチェックされ、ループしてはなりません。

+0

ダグに右クリックされたラベルを変更するためだけに使用されます!ありがとうございます。私はそれを確認します。 –

+0

が正しく動作していません。おそらくいくつかの情報があります。コードは右クリックされたラベルのみを変更する必要があります。現在、最初の開始はs1に設定されますが、s2になるとs2に変更されますが、メッセージボックスにラベルがある回数を示すelseifのループとエラーを続けます。つまり、ラベルが10個ある場合、elseifエラーが10回表示されます –

+1

フォーム内のすべてのコントロールをループして、ラベルを探しています。マイケル・Zの答えはあなたが何をしようとしているべきかを示しています。 すべてのラベルではなく実際にクリックされたラベルに対してのみ、このメソッドを実行する必要があります。 –

1

メソッドで適切な署名を使用する必要があります。それはこのように見えるはずです。

Label1_Click(sender As Object, e As EventArgs) 

次に、あなたがラベルに送信者をキャストしてテキストを設定することができます。

Ctype(sender, Label).Text = "S1" 
関連する問題