Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Programmeren

Control arrays in VB.NET

RubeL
5 antwoorden
  • Het is niet mogelijk om control arrays aan te maken in VB.NET. Is er een andere mogelijkheid om controls op *een* form in groepen te verdelen en te indexeren zodat ze in een lus kunnen worden bewerkt? b.v. een groep labels geindexeerd van 1 tot 6, een andere groep labels daarnaast van 1 tot 10, een groep textboxen geindexeerd van 1 tot 5 enz.
  • VB.NET is geen minor upgrade; het is een objectgeoriënteerde taal geworden. Een control is niet meer een control zoals dat in VB6 zo was, het is een instantie van een klasse.

    Wat jij wilt is op zich wel mogelijk, maar vereist een omweg.
    Je moet een collectieklasse gaan schrijven zodat je de items kunt enumereren.

    Er zijn hiervan genoeg voorbeelden te vinden op het Internet.

    Kom je er echt helemaal niet uit, post dan nog eens terug.
  • Hallo RubeL,

    Wat er wordt aangeboden is code voor een class die alleen maar door de Controls collectie van een form loopt en op basis van het type en de naam ze indeelt in een bepaalde zelfgedefinieerde collectie. Wel voorziet de class in een gemeenschappelijke event handler voor de collectie.

    Ik vind het nogal omslachtig allemaal. Is dit echt de enige methode?

    grtz, T.
  • Ik heb eens een control array proberen te maken in Visual Basic.NET, DAT was pas omslachtig (en een grote mislukking)…

    Je kunt in principe van elk object een array maken, dus ook van een control. Echter, dit wordt niet ondersteund door de designer (= de grafische tool van Visual Studio .NET om controls via sleur-en-pleur op een formulier te zetten).

    Handmatig doe je het als volgt:

    [code:1:8a8285c668]
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim mijnKnoppen(1) As Button

    mijnKnoppen(0) = New Button
    mijnKnoppen(0).Location = New System.Drawing.Point(10, 10)
    mijnKnoppen(0).Text = "Klik hier"

    mijnKnoppen(1) = New Button
    mijnKnoppen(1).Location = New System.Drawing.Point(50, 50)
    mijnKnoppen(1).Text = "Tweede knop"

    Me.Controls.AddRange(mijnKnoppen)
    End Sub
    [/code:1:8a8285c668]

    OK, dit is lastig maar wel te doen …

    Het is echter onmogelijk om de knoppen wat te laten.
    Om een eventhandler aan een knop te hangen moet je de knop nl. declareren met WithEvents (ken je misschien nog uit VB6).
    Dit is niet mogelijk met een array.

    End of Story.

    Als je het echt wilt gebruiken, doe het dan als volgt:
    [code:1:8a8285c668]
    Private myButtonControlArray As Button = {Button1, Button2, Button3}
    [/code:1:8a8285c668]

    Vervolgens kun je er als volgt doorheen loopen:
    [code:1:8a8285c668]
    For Each mijnKnop As Button In myButtonControlArray
    'acties
    Next
    [/code:1:8a8285c668]
  • RubeL,

    Bedankt voor de suggestie. Het idee is hetzelfde als de klasse die ik heb gevonden maar wat korter en eenvoudiger. De conclusie is wel:

    De collectie staat alleen de mogelijkheid toe om met een For…Next door de verzameling controls te lopen en eigenschappen te wijzigen.

    De controls in de collectie hebben geen gemeenschappelijke events!

    Dus in een form met zeg 20 textboxen in een collectie heb je 20 Validate events nodig om vast te stellen in welke textbox de gebruiker iets heeft veranderd, ipv een, zoals in VB6.

    Hetzelfde met een array van bv 5 buttons, je hebt dus nog altijd 5 Click event procedures nodig om te weten op welke button de gebruiker klikt!

    Dat kan toch niet waar zijn…. :( :( :(

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.