none
Dim x as new List(of T) RRS feed

  • Frage

  • Hallo Experten

    ist es möglich ein Anzahl von Controls (z.B: Label1,Label2 etc) die zur Entwurfzeit erstellt wurden einer "List" bereits bei der Definition zu zuordnen?

    Public xlaRang As New List(Of Label)

    oder muss jedes Label mit .controls.add hinzugfügt werden ?

    mfg eem monarch

    Dienstag, 17. Januar 2012 18:21

Antworten

  • Hallo Monarch,

    Elmar war schneller. Hier eine andere Lösung mit der .AddRange Methode:

    Public Class Form1
        Private lblList As New List(Of Label)
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim l() As Label = {Me.Label1, Me.Label2}
            lblList.AddRange(l)
        End Sub
    End Class
    

    Gruss Ellen

     


    Ich benutze/ I'm using VB2008 & VB2010
    Dienstag, 17. Januar 2012 20:11
  • Hallo,

    das kannst Du mit Auflistungsinitialisierern erreichen.
    Wenn die Label über den Designer erstellt werden,
    kannst Du die Instanz frühestens nach InitializeComponent erzeugen,
    denn vorher existieren sie (logischerweise) noch nicht:

        Dim labelList As List(Of Label)
    
        Public Sub New()
            InitializeComponent()
    
            labelList = New List(Of Control) From
                {
                    Me.Label1,
                    Me.Label2
                }
        End Sub
    
    

    (mit Zeilenumbrüchen nach freier Wahl ;-)

    Im Hintergrund erzeugt dabei der Visual Basic Compiler eben jene Add Anweisungen,
    die Du ansonsten wie gezeigt programmieren würdest.

    Gruß Elmar

    Dienstag, 17. Januar 2012 19:55
    Beantworter

Alle Antworten

  • Hallo Experten

    ist es möglich ein Anzahl von Controls (z.B: Label1,Label2 etc) die zur Entwurfzeit erstellt wurden einer "List" bereits bei der Definition zu zuordnen?

    Hallo Monarch,

    nein. Zur Entwurfzeit lässt sich im Designer keine List(of Label) erstellen. Aber programmatisch geht das realitiv einfach:

    Public Class Form1
        Private lblList As New List(Of Label)
        Private pt As New Point(0, 0)
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            For i As Integer = 0 To 9
                lblList.Add(New Label)
                lblList(i).BackColor = Color.Aqua
                lblList(i).ForeColor = Color.Black
                lblList(i).BorderStyle = BorderStyle.FixedSingle
                lblList(i).Size = New Size(100, 20)
                lblList(i).TextAlign = ContentAlignment.MiddleLeft
    
                lblList(i).Location = pt
                lblList(i).Text = "Label" & i.ToString
                Me.Controls.Add(lblList(i))
                pt.Y += 25
            Next
        End Sub
    End Class
    

     

    Ist das Deine Frage?

    Was noch noch geht: Dynamisch ein erstelltes Label zur Liste hinzufügen:

    lblList.Add(Label10) ggf weitere Eigenschaften. Voraussetzung ist, dass die Instanz Label10 existiert.

    Gruss Ellen

     

     


    Ich benutze/ I'm using VB2008 & VB2010
    Dienstag, 17. Januar 2012 18:56
  • hi Ellen,

    das ist mir klar, war auch nicht Frage, sorry. Die Frage ist ob es möglich ist eine Anzahl von Labels (Label1, Label2, etc) die zur Entwurfzeit erstellt wurden in einer Codezeile (Laufzeitcode) einer List zugeordnet werden können.

    Public xlaRang As New List(Of Label)
    ...
    
    Public sub ...
     xlaRang.add(me.Label1)
     xlaRang.add(me.Label2)
     xlaRang.add(me.Label3)
     xlaRang.add(me.Label4)
     ...etc.
    end sub
    

    Die Form besitzt ca. 40 Labels mit unterschiedliche Eigenschaften, die will ich nicht alle zur Laufzeit erstellen, das geht einfacher zur Entwurfzeit. Die Frage ist nun ob jedes einzelne Label über .add zur Liste hinzugefügt werden muss oder ob man das in einer Codezeile bei der Definition der Liste(xlaRang) erledigen kann

    mfg eem monarch

    Dienstag, 17. Januar 2012 19:14
  • Hallo,

    das kannst Du mit Auflistungsinitialisierern erreichen.
    Wenn die Label über den Designer erstellt werden,
    kannst Du die Instanz frühestens nach InitializeComponent erzeugen,
    denn vorher existieren sie (logischerweise) noch nicht:

        Dim labelList As List(Of Label)
    
        Public Sub New()
            InitializeComponent()
    
            labelList = New List(Of Control) From
                {
                    Me.Label1,
                    Me.Label2
                }
        End Sub
    
    

    (mit Zeilenumbrüchen nach freier Wahl ;-)

    Im Hintergrund erzeugt dabei der Visual Basic Compiler eben jene Add Anweisungen,
    die Du ansonsten wie gezeigt programmieren würdest.

    Gruß Elmar

    Dienstag, 17. Januar 2012 19:55
    Beantworter
  • Hallo Monarch,

    Elmar war schneller. Hier eine andere Lösung mit der .AddRange Methode:

    Public Class Form1
        Private lblList As New List(Of Label)
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim l() As Label = {Me.Label1, Me.Label2}
            lblList.AddRange(l)
        End Sub
    End Class
    

    Gruss Ellen

     


    Ich benutze/ I'm using VB2008 & VB2010
    Dienstag, 17. Januar 2012 20:11