Werken met dynamische controls

Status
Niet open voor verdere reacties.

dandik

Gebruiker
Lid geworden
11 aug 2008
Berichten
6
Hoe kan ik waarden van dynamisch aangemaakte tekstvakken gebruiken ??
Ik Maak bijvoorbeeld door een knopklik een tekstvak "txttekstvak1" aan. Bij een tweede keer drukken "txttekstvak2", bij een derde "txttekstvak3" , enz .....

dit ziet er als volgt uit
Code:
Private Sub btnknop1_Click ( ....)

static nr as integer = 1  

Dim newtekstvak As New TextBox
        With newtekstvak
            .Name = "txttekstvak" & nr.ToString
            ' andere properties 
        End With

end sub

Hoe kan ik nu een andere sub maken die de waarde van deze ( nu nog niet aangemaakte) kan gebruiken ??




Private Sub btnknop2_Click ( ....)

'als ik nu met mijn knop1 bijvoorbeeld 3 tekstvakken heb gemaakt
'en met knop2 deze waarden wil optellen ,kan ik toch niet ....

dim whatever as integer
whatever = cint(txttekstvakt1.text) + cint(txttekstvakt2.text) + cint(txttekstvakt3.text)

' want die teksvakken nog niet bij het schrijven van de code ?

end sub


ik hoop dat het wat duidelijk is , waarschijnlijk is de oplossing simpeler dan de vraag.
ik vermoed dat je eerste een controle search moet doen op het bestaan van tekstvak1 , 2 en drie ...
alvast bedankt
 
Laatst bewerkt:
als je die aangemaakte controls in een collectie steekt (nroaamlgezien Me.Controls), dan kan je die er nadien ook gewoon uitlezen met ofwel de index ervan, ofwel de naam.

Me.Controls.item("controlNaam")
> Dat geeft je je control

Code:
sub blaaat
dim totaal as integer = 0
for x as integer = 0 to nr
totaal += cint(ctype(Me.Controls.item("controlNaam" & x.tostring), textfield).text)
next x
end sub
> Telt de inhoud van je textvakken op
 
Hoe gaat dit met Buttons?

Beste,

Heb hetzelfde voor met dit soort code. maar dan net iets anders: ik wil met buttons werken ipv met textboxes.

Ik probeer een dynamisch formulier te maken waarin ik gegevens oproep vanuit een datagrid: Ik klik in datagrid1 (productcategorieën) en vervolgens laat ik zoveel knoppen maken opdat alle producten (die ik ophaal uit datagrid2) aanklikbaar zijn met een button.

Dit betekent dat als ik op productcategorie1 klik, er bvb 5 knoppen getoond moeten worden met ieders het betreffende product. Indien ik op productcategorie2 klik, welke bvb maar 3 producten kent, moeten dus de 5 knoppen die ik net toevoegde door op productcategorie1 te klikken verdwijnen en dienen er 3 nieuwe knoppen te ontstaan.

De code die ik heb is de volgende:
Code:
Private Sub ProdPlaatsen(ByVal Plaatsen As Boolean)
        Dim Teller As Integer
        Dim NProds As Integer

        NProds = ProductenBindingSource.Count

        For Teller = 1 To NProds
            Dim newButton As New Button
            With newButton
                .Name = "BT" & Teller.ToString()
                .Text = ProductenDataGridView.CurrentCell.Value
                .Top = Teller * 40
                .Left = 20
                .Visible = Plaatsen
                If Plaatsen Then
                    Me.Controls.Add(newButton)
                Else
                    Me.Controls.Remove(newButton)
                End If
            End With
            ProductenBindingSource.MoveNext()
        Next Teller

    End Sub

ProdPlaatsen wordt opgeroepen (als true) wanneer het formulier opstart. Voor de datagrid z'n focus krijgt, wordt ProdPlaatsen opgeroepen (als false-> met de bedoeling de knoppen te verwijderen uit me.controls en dus ook van m'n form) en vervolgens bij het aanduiden van de nieuwe productcategorie wordt de procedure opgeroepen als true.

Wat doe ik verkeerd????
 
Laatst bewerkt:
Wat krijg je precies als fout?

Je kan best ook
.Visible = Plaatsen
weg halen, dan kan je er zeker van zijn dat je buttosn effectief weg zijn als je hem runt.
 
Heb net .visible weggelaten zonder resultaat.

Heb geprobeerd om de code ProductenPlaatsen enkel te laten uitvoeren bij het opstarten vh formulier.

Als ik nu in m'n datagrid klik, roep ik enkel ProductenVerwijderen op. (Dit zou er dan voor moeten zorgen dat ik geen knoppen meer heb.

Ook deze laatste 2 wijzigingen zorgen er niet voor dat de knoppen verwijderen.
 
Dus de fout is dat je knoppen niet weg gaan?

Logisch als je er bij nadenkt. Ze worden wel uit die collectie gehaald, maar ze bestaan nog steeds...

Code:
           dim naam as string = "BT" & Teller.ToString()
                If Plaatsen Then
            With newButton
                .Name = naam
                .Text = ProductenDataGridView.CurrentCell.Value
                .Top = Teller * 40
                .Left = 20
                .Visible = Plaatsen
                    Me.Controls.Add(newButton)
            End With
                Else
                   Me.Controls.item(naam).dispose()
                End If

Die code zou beter moeten werken. als .dispose niet werkt kan je hem ook gelijkstellen aan nothing ofzo :)
 
Buttons vervolgens gebruiken

Hey SUPERbedankt voor je reactie. Werkt perfect nu!

Heb wel nog een volgende vraag. Ik heb nu de mogelijkheid om knoppen toe te voegen en vervolgens weer te verwijderen. Maar nu wens ik een aangepaste code achter deze knoppen te steken. Gezien deze knoppen nog niet gekend zijn bij het opstarten, kan je de knoppen nog niet achter "handles" krijgen.


Ik heb dus geen idee hoe ik aan deze toegevoegde knoppen een procedure kan 'hangen'.

Ik probeerde zelf hetvolgende welk een fout geeft:
Code:
Private Sub NieuweKnopClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles me.controls.item(newButton)
'hier dan de code die aan deze in runtime toegevoegde knop moet komen
End Sub

Hoe krijg ik dit wel werkende?
 
Dat is al net wat complexer
Code:
Public Class Form1

    Private WithEvents defaultButton As New Button

    Public Sub New()
        ' This call is required by the Windows Form Designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
        With defaultButton
            .Left = 20
        End With
    End Sub

    Private Sub ProdPlaatsen(ByVal Plaatsen As Boolean)
        Dim Teller, NProds As Integer
        Dim newButton As Button
        Dim naam As String

        NProds = ProductenBindingSource.Count

        For Teller = 1 To NProds
            naam = "BT" & Teller.ToString()
            newButton = defaultButton
            If Plaatsen Then
                With newButton
                    .Name = naam
                    .Text = ProductenDataGridView.CurrentCell.Value
                    .Top = Teller * 40
                    .Visible = Plaatsen
                    AddHandler .Click, New EventHandler(AddressOf prodBtns_Click)
                    ' hier kan je makkelijk nog andere handlers toevoegen
                    Me.Controls.Add(newButton)
                End With
            Else
                Me.Controls.Item(naam).Dispose()
            End If
        Next Teller

    End Sub

    Private Sub prodBtns_Click(ByVal sender As Object, ByVal e As EventArgs)
        MessageBox.Show("you clicked button " & CType(sender, Button).Name)
    End Sub

End Class

het kan goed zijn dat er een beter manier is om event handlers toe te kennen, maar zo doe ik het toch steeds :)
 
Hoi BN2VS,

Ik heb je code geprobeerd, maar echter zonder resultaat. De knoppen worden niet meer goed weergegeven. Ze willen niet meer verdwijnen,...

Ik heb de volgende code die werkt om de knoppen toe te voegen aan een panel. Ook het verwijderen werkt perfect. Ik heb de code van jou toegevoegd tussen mijn lijnen. Maar dit lukt niet al te best. Ik denk dat dit te maken heeft met de declaratie van de newButton voor de Teller-loop.

Zou je kunnen vertrekken van volgende code en dan inpassen zodat de knoppen een actie krijgen wanneer ze aangeklikt worden.
Code:
Public Class Producten
    Public AaNtalProducten As Integer

    Private Sub ProdPlaatsen(ByVal Plaatsen As Boolean)
        Dim Teller As Integer
        Dim NProds As Integer
        Dim Naam As String = "BT" & Teller.ToString

        NProds = ProductenBindingSource.Count
        ProductenBindingSource.MoveFirst()
        Teller = 1
        If Plaatsen Then

            For Teller = 1 To NProds
                Dim newButton As New Button

                Naam = "BT" & Teller.ToString
                With newButton
                    .Name = Naam
                    .Text = ProductenDataGridView.CurrentCell.Value
                    .Top = Teller * 40
                    .Left = 20
                    pnlProducten.Controls.Add(newButton)

                End With
                ProductenBindingSource.MoveNext()

            Next Teller

        Else

            For Teller = 1 To AaNtalProducten
                Naam = "BT" & Teller.ToString
                If Not IsNothing(pnlProducten.Controls.Item(Naam)) Then pnlProducten.Controls.Item(Naam).Dispose()
            Next

        End If

        AaNtalProducten = Teller
    End Sub


    Private Sub ProductCategorieDataGridView_CellClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles ProductCategorieDataGridView.CellClick
        ProdPlaatsen(False) 'De oude knoppen verwijderen
        ProdPlaatsen(True) 'De nieuwe knoppen plaatsen
    End Sub

    Private Sub Producten_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ProdPlaatsen(True) ' De knoppen plaatsen voor item1 in de datagrid
    End Sub
End Class


Thx!
 
Hey,

Mijn code is idd verkeerd geimplementeerd.
Probeer hem eerst eens uit zonder er iets aan te veranderen ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan