2012-03-26 7 views
3

私のデザインフォームには、すべての命名規則を共有するラベルボックスがあります。lbl_#.textここで、範囲は1から60までです。それぞれを繰り返してループを作りたいですか?lbl_#.textこの質問の理論的目的のために2の倍数と言う。最終結果は以下に達するであろうと、このようなVB.NETフォームのラベルを繰り返す

何か:

lbl_1.text = "2" 
lbl_2.text = "4" 
lbl_3.text = "6" 
... 
lbl_60.text = "120" 

私は、符号化側からこれらのラベルのそれぞれにアクセスする方法がわからないんだけど、私は明示的に各ラベルに言及する方法を知っていると値を割り当てる:/

答えて

2

は、Controlsコレクションを使用します。

Public Class Form1 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Dim i As Integer 
     For i = 1 To 3 
      Dim myLabel As Label = CType(Me.Controls("lbl_" & i), Label) 
      myLabel.Text = ...whatever value you want to put here 
     Next 
    End Sub 
End Class 
+0

これはひどい実装です。強い名前のラベルの想定範囲から上限と下限を指定しています。ラベル2の名前が変更されたり見つからなかったりすると、コードが壊れてしまいます。時間の経過と共に追加されたラベルは考慮されません。適切な方法は、各ループに対してaを使用し、[containerObjectName] .Controls.OfType(of Label)()に含まれるラベルオブジェクトを反復処理することです。 – Matth3w

4

いくつかのオプションがここにあります。

  • このような状況では、ラベルにはパネルまたはグループボックスコントロールなどの共通のコンテナが含まれることがよくあります。その場合は:

    For Each formLabel As Label In myContainerControl.Controls.OfType(Of Label)() 
        '... 
    Next formLabel 
    

    もちろん、これは論理グループと視覚的なグループを混在させ、その2つのものが常に整列するとは限りません。そして、あなたも...

  • は、アレイ(またはラベルリスト()または可算他)にそれらのすべてを追加することができます

    Dim formLabels(60) As Label = {lbl_1, lbl_2, lbl_3 .... } 
    
    For Each formLabel As Label in formLabels 
        '... 
    Next formLabel 
    
  • .nameのプロパティを使用します。

    For Each formLabel As Label In Controls.Where(Function(c) c.Name.StartsWith("lbl_")) 
        '... 
    Next formLabel 
    
  • 上記のいくつかの組み合わせ(たとえば、名前プロパティに基づいてリストを作成するためのloadイベントという形式のコード)。

最終的な戦略は、あなたのラベルがDataGridViewの、FlowLayoutPanel、または類似の一部として作成されたデータソースへの結合の観点で考えることです。次に、グリッドまたはパネルの行を反復することができます。

+0

これは素晴らしい答えです!どうもありがとうございます。 –

1

ラベルの数がわからない場合は、Do Loopを使用する方法もあります。

Dim lblTarget As Label = Nothing 
    Dim intCursor As Integer = 1 
    Dim bolFirstIteration As Boolean = True 

    Do Until lblTarget Is Nothing AndAlso Not bolFirstIteration 

     If bolFirstIteration Then 

      bolFirstIteration = False 

     End If 

     lblTarget = CType(Me.Controls("lbl_" & intCursor.ToString()), Label) 

     If Not lblTarget Is Nothing Then 

      lblTarget.Text = (intCursor * 2).ToString() 

     End If 

     intCursor += 1 

    Loop 
関連する問題