Oggetti del form dinamici

di il
26 risposte

26 Risposte - Pagina 2

  • Re: Oggetti del form dinamici

    andrea25 ha scritto:


    la sintassi giusta è:
    
          For Each controllo In Panel1.Controls
                If controllo.GetType Is GetType(Label) Then
                   ' tuo codice ......
                End If
          Next
    

    Perfetto, grazie
    Prego ma anche:
    
            For Each controllo In Panel1.Controls
                If TypeOf controllo Is Label Then
                    ' tuo codice .....
                End If
            Next
    è equivalente
  • Re: Oggetti del form dinamici

    Rubik ha scritto:


    ....
    Ma l'approcio più logico per un programmatore che ha 20, 30, 40 Text, gestibili con dei cicli, è avere le text in una matrice e identificarle con l'indice.
    Ottimo esempio Rubik, ma se utilizzo Option Strict On dà errore di Associazione tardiva non permessa sulle righe come questa
    - Dim Indice As Integer = sender.tag()
    ho provato con
    - Dim Indice As Integer = DirectCast(sender, Control).Tag()
    senza successo

    EDIT:
    in parte risolto con
    - Dim indice As Integer = CType(DirectCast(sender, Control).Tag.ToString, Integer)
    ma mi manca da risolvere
    - sender.text = "cliccato " & indice.ToString("00")
  • Re: Oggetti del form dinamici

    patel ha scritto:


    Rubik ha scritto:


    ....
    Ma l'approcio più logico per un programmatore che ha 20, 30, 40 Text, gestibili con dei cicli, è avere le text in una matrice e identificarle con l'indice.
    Ottimo esempio Rubik, ma se utilizzo Option Strict On dà errore di Associazione tardiva non permessa sulle righe come questa
    - Dim Indice As Integer = sender.tag()
    ho provato con
    - Dim Indice As Integer = DirectCast(sender, Control).Tag()
    senza successo
    In VisualBasic .Net, Option Strict di default è a Off, perché se si sceglie di programmare in Visual Basic si preferisce delegare il compilatore per tutte le conversioni (si chiamano conversioni Implicite), se si imposta Option Strict On, tutte le conversioni devono essere esplicite e il programmatore se ne deve fare carico.
    
    Option Strict On
            Dim a As Integer = "10" ' errore di conversione implicita da string a integer
            Dim b As Integer = Convert.ToInt16("10") ' nessun errore
    
    Riposto il codice con Option Strict On e tutte le conversioni esplicite, ho aggiunto un FlowLayoutPanel, per mostrare come le righe si adattano al ridimensionamento del form.
    Ho sostituito le matrici di controlli, con le liste di controlli, più versatili.
    Per semplificare il Form viene creato a runtime nulla da aggiungere in progettazione.
    L'esempio è uno dei metodi possibili, una base di partenza per usare i controlli in modo diretto, senza For Each.
    
    Option Strict On
    
    Public Class Form1
    
        Dim TextIN As New List(Of TextBox) ' lista di Text
        Dim Label1 As New List(Of Label) ' lista di Label
        Dim Label2 As New List(Of Label) ' lista di Label
        Dim PanelConte As New List(Of Panel) ' conterrà una text e due label
        Dim TextRIGHE As New TextBox
        Dim ButVisualizza As New Button
        Dim LabelSU As New Label
    
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            Me.Size = New Size(520, 554)
            Dim NumRighe As Integer = 49 ' numero di righe da creare a piacere
    
            ' preparazione form e pannelli
            ' aggiunta bottone text e label per scelta visualizzazione
            TextRIGHE.Text = NumRighe.ToString()
            TextRIGHE.Location = New Point(100, 12)
            TextRIGHE.Width = 30
            Me.Controls.Add(TextRIGHE)
            LabelSU.Text = "su " & NumRighe.ToString()
            LabelSU.Location = New Point(135, 16)
            Me.Controls.Add(LabelSU)
            ButVisualizza.Text = "Visualizza"
            ButVisualizza.Location = New Point(14, 10)
            AddHandler ButVisualizza.Click, AddressOf ButVisualizza_OnClick ' permette di avere l'evento click
            Me.Controls.Add(ButVisualizza)
    
            ' aggiunta FlowLayoutPanel
            Dim PanelScroll As New FlowLayoutPanel ' conterrà i PanelConte
            PanelScroll.Location = New Point(10, 40)
            PanelScroll.Size = New Size(Me.Width - 35, Me.Height - 90)
            PanelScroll.BorderStyle = BorderStyle.FixedSingle
            PanelScroll.Anchor = AnchorStyles.Left Or AnchorStyles.Bottom Or AnchorStyles.Top Or AnchorStyles.Right
            PanelScroll.AutoScroll = True
            Me.Controls.Add(PanelScroll)
    
            ' riempio tre Liste di controlli e li aggiungo al PanelConte e al PanelScroll
            For riga = 0 To NumRighe
                TextIN.Add(New TextBox) ' creo le textbox
                TextIN(riga).Name = "TexIN" & riga.ToString("00") ' nome composto
                TextIN(riga).Left = 10
                TextIN(riga).Top = 10
                TextIN(riga).Tag = riga ' fa comodo per risolvere l'indice
                AddHandler TextIN(riga).Click, AddressOf TextIN_OnClick ' permette di avere l'evento click
    
                Label1.Add(New Label) ' creo le label1
                Label1(riga).Name = "Label1" & riga.ToString("00") ' nome composto
                Label1(riga).Left = 120
                Label1(riga).Top = 10
                Label1(riga).Tag = riga ' fa comodo per risolvere l'indice
                Label1(riga).BackColor = Color.LightGray
                Label1(riga).TextAlign = ContentAlignment.MiddleCenter
                AddHandler Label1(riga).Click, AddressOf Label1_OnClick ' permette di avere l'evento click
    
                Label2.Add(New Label) ' creo le label2
                Label2(riga).Name = "Label2" & riga.ToString("00") ' nome composto
                Label2(riga).Left = 230
                Label2(riga).Top = 15
                Label2(riga).Tag = riga ' fa comodo per risolvere l'indice
                Label2(riga).BackColor = Color.WhiteSmoke
                Label2(riga).AutoSize = True
                AddHandler Label2(riga).Click, AddressOf Label2_OnClick ' permette di avere l'evento click
    
                PanelConte.Add(New Panel) ' creo un nuovo pannello contenitore
                PanelConte.Item(riga).Size = New Size(450, 40)
                PanelConte.Item(riga).BackColor = Color.DarkGray
                PanelConte.Item(riga).BorderStyle = BorderStyle.FixedSingle
                PanelConte.Item(riga).Controls.Add(TextIN(riga)) ' nel pannello contenitore aggiungo text
                PanelConte.Item(riga).Controls.Add(Label1(riga)) ' nel pannello contenitore aggiungo label
                PanelConte.Item(riga).Controls.Add(Label2(riga)) ' nel pannello contenitore aggiungo label
                PanelScroll.Controls.Add(PanelConte.Item(riga)) ' nel FlowLayoutPanel aggiungo il pannello contenitore
            Next riga
    
            ' posso usare i cicli
            For rig = 0 To NumRighe
                Label1(rig).Text = "cliccami"
                TextIN(rig).Text = "scrivi su " & TextIN(rig).Name
            Next rig
        End Sub
    
        Sub TextIN_OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
            ' solo d'esempio
            Dim tText As TextBox = CType(sender, TextBox) ' conversione esplicita da Object a TextBox
            Dim ClicX As Integer = tText.Left ' coordinata X della text cliccata
            Dim ClicY As Integer = tText.Top ' coordinata Y della text cliccata
            Dim Indice As Integer = Convert.ToInt16(tText.Tag()) ' indice della text cliccata
            Dim NomeText As String = tText.Name ' nome della Text
            tText.Text = "cliccato " & Indice.ToString("00")
            Me.Text = "riga " & Indice
        End Sub
    
        Private Sub Label1_OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
            ' solo d'esempio
            Dim lLabel As Label = CType(sender, Label) ' conversione esplicita da Object a Label
            Dim ClicX As Integer = lLabel.Left ' coordinata X della Label1 cliccata
            Dim ClicY As Integer = lLabel.Top ' coordinata Y della Label1 cliccata
            Dim Indice As Integer = Convert.ToInt16(lLabel.Tag()) ' indice della Label1 cliccata
            Dim NomeLabel1 As String = lLabel.Name ' nome della Label1
            lLabel.Text = "cliccato"
            ' con gli indici si schiude un mondo
            Label2(Indice).Text = "nella " & TextIN(Indice).Name & " c'è scritto:  " & TextIN(Indice).Text
            Me.Text = "riga " & Indice
        End Sub
    
        Private Sub Label2_OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
            ' solo d'esempio
            Dim lLabel As Label = CType(sender, Label) ' conversione esplicita da Object a Label
            Dim ClicX As Integer = lLabel.Left ' coordinata X della Label2 cliccata
            Dim ClicY As Integer = lLabel.Top ' coordinata Y della Label2 cliccata
            Dim Indice As Integer = Convert.ToInt16(lLabel.Tag()) ' indice della Label2 cliccata
            Dim NomeLabel1 As String = lLabel.Name ' nome della Label2
            lLabel.Text = "cliccato"
            Me.Text = "riga " & Indice
        End Sub
    
        Private Sub ButVisualizza_OnClick(sender As Object, e As EventArgs)
            ' visualizzazione di un numero scelto di controlli
            Dim quante As Integer = Convert.ToInt16(TextRIGHE.Text)
    
            For rig = 0 To TextIN.Count - 1
                ' If rig > quante Then PanelConte(rig).Visible = False Else PanelConte(rig).Visible = True
                If rig > quante Then TextIN(rig).Visible = False Else TextIN(rig).Visible = True
                If rig > quante Then Label1(rig).Visible = False Else Label1(rig).Visible = True
                If rig > quante Then Label2(rig).Visible = False Else Label2(rig).Visible = True
            Next
        End Sub
    End Class
    
  • Re: Oggetti del form dinamici

    Grazie Rubik
  • Re: Oggetti del form dinamici

    Rubik ha scritto:


    andrea25 ha scritto:


    la sintassi giusta è:
    
          For Each controllo In Panel1.Controls
                If controllo.GetType Is GetType(Label) Then
                   ' tuo codice ......
                End If
          Next
    

    Perfetto, grazie

    Prego ma anche:
    
            For Each controllo In Panel1.Controls
                If TypeOf controllo Is Label Then
                    ' tuo codice .....
                End If
            Next
    è equivalente
    Sto riscontrando dei problemi con quel codice.
    Ho provato a farlo su dei datetimepicker piuttosto che delle label e non me le intercetta.
    Le mie datetimepicker si trovano all’interno del panel e io mio codice è:

    For i = 1 to n
    tag = “RIGA” & i

    for each controllo in panel.controls
    if controllo.gettype is gettype(datetimepicker) and controllo.tag is tag then
    data = CDate(controllo.text)
    end if
    next

    next


    Facendo partire il codice non mi dava errori ma non mi intercettava nessuna datetimepicker. Sapreste per caso il motivo ?
  • Re: Oggetti del form dinamici

    andrea25 ha scritto:


    Facendo partire il codice non mi dava errori ma non mi intercettava nessuna datetimepicker. Sapreste per caso il motivo ?
    Dal codice che hai postato significa che non hai capito, se decidi di usare una lista di controlli, For Each non serve più, perché all'interno di ogni lista il tuo controllo lo raggiungi con l'indice non devi fare una ricerca.
    Se fai una lista di DateTimePicker, l'evento Click non si attiverà quando cambi la data, ma devi usare l'evento ValueChanged
    Ti posto un codice, prima di copiare e incollare in un altro programma cerca di capire perché fa quello che fa, cambiando valori disposizioni ecc ecc.
    Se capisci, poi sei in grado di modificare e ampliare quello che ho postato alle tue esigenze.
    Option Strict On
    
    Public Class Form1
    
        Dim TextIN As New List(Of TextBox) ' lista di Text
        Dim Label1 As New List(Of Label) ' lista di Label
        Dim TimePick As New List(Of DateTimePicker) ' lista di DateTimePicker
        Dim PanelConte As New List(Of Panel) ' lista di pannelli, ogni pannello conterrà una text e una label e un DateTimePicker
        Dim TextRIGHE As New TextBox
        Dim ButVisualizza As New Button
        Dim LabelSU As New Label
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            Me.Size = New Size(520, 554)
            Dim NumRighe As Integer = 49 ' numero di righe da creare a piacere
    
            ' preparazione form e pannelli
            ' aggiunta bottone text e label per scelta visualizzazione
            TextRIGHE.Text = NumRighe.ToString()
            TextRIGHE.Location = New Point(100, 12)
            TextRIGHE.Width = 30
            Me.Controls.Add(TextRIGHE)
            LabelSU.Text = "su " & NumRighe.ToString()
            LabelSU.Location = New Point(135, 16)
            Me.Controls.Add(LabelSU)
            ButVisualizza.Text = "Visualizza"
            ButVisualizza.Location = New Point(14, 10)
            AddHandler ButVisualizza.Click, AddressOf ButVisualizza_OnClick ' permette di avere l'evento click
            Me.Controls.Add(ButVisualizza)
    
            ' aggiunta FlowLayoutPanel
            Dim PanelScroll As New FlowLayoutPanel ' conterrà i PanelConte
            PanelScroll.Location = New Point(10, 40)
            PanelScroll.Size = New Size(Me.Width - 35, Me.Height - 90)
            PanelScroll.BorderStyle = BorderStyle.FixedSingle
            PanelScroll.Anchor = AnchorStyles.Left Or AnchorStyles.Bottom Or AnchorStyles.Top Or AnchorStyles.Right
            PanelScroll.AutoScroll = True
            Me.Controls.Add(PanelScroll)
    
            ' riempio tre Liste di controlli e li aggiungo al PanelConte ogni panelconte verrà aggiunto al PanelScroll
            For riga = 0 To NumRighe
                TextIN.Add(New TextBox) ' creo le textbox
                TextIN(riga).Name = "TexIN" & riga.ToString("00") ' nome composto
                TextIN(riga).Left = 10
                TextIN(riga).Top = 10
                TextIN(riga).Tag = riga ' fa comodo per risolvere l'indice
                AddHandler TextIN(riga).Click, AddressOf TextIN_OnClick ' permette di avere l'evento click
    
                Label1.Add(New Label) ' creo le label1
                Label1(riga).Name = "Label1" & riga.ToString("00") ' nome composto
                Label1(riga).Left = 120
                Label1(riga).Top = 10
                Label1(riga).Tag = riga ' fa comodo per risolvere l'indice
                Label1(riga).BackColor = Color.LightGray
                Label1(riga).TextAlign = ContentAlignment.MiddleCenter
                AddHandler Label1(riga).Click, AddressOf Label1_OnClick ' permette di avere l'evento click
    
                TimePick.Add(New DateTimePicker) ' creo i DateTimePicker
                TimePick(riga).Name = "Label2" & riga.ToString("00") ' nome composto
                TimePick(riga).Left = 230
                TimePick(riga).Top = 10
                TimePick(riga).Tag = riga ' fa comodo per risolvere l'indice
                TimePick(riga).BackColor = Color.WhiteSmoke
                TimePick(riga).AutoSize = True
                AddHandler TimePick(riga).ValueChanged, AddressOf TimePick_ValueChanged ' permette di avere l'evento ValueChanged
    
                PanelConte.Add(New Panel) ' creo un nuovo pannello contenitore
                PanelConte.Item(riga).Size = New Size(450, 40)
                PanelConte.Item(riga).BackColor = Color.DarkGray
                PanelConte.Item(riga).BorderStyle = BorderStyle.FixedSingle
                PanelConte.Item(riga).Controls.Add(TextIN(riga)) ' nel pannello contenitore aggiungo text
                PanelConte.Item(riga).Controls.Add(Label1(riga)) ' nel pannello contenitore aggiungo label
                PanelConte.Item(riga).Controls.Add(TimePick(riga)) ' nel pannello contenitore aggiungo DateTimePicker
                PanelScroll.Controls.Add(PanelConte.Item(riga)) ' nel FlowLayoutPanel aggiungo il pannello contenitore
            Next riga
    
            ' posso usare i cicli
            For rig = 0 To NumRighe
                Label1(rig).Text = "cliccami"
                TextIN(rig).Text = "scrivi su " & TextIN(rig).Name
            Next rig
        End Sub
    
        Sub TextIN_OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
            ' solo d'esempio
            Dim tText As TextBox = CType(sender, TextBox) ' conversione esplicita da Object a TextBox
            Dim ClicX As Integer = tText.Left ' coordinata X della text cliccata
            Dim ClicY As Integer = tText.Top ' coordinata Y della text cliccata
            Dim Indice As Integer = Convert.ToInt16(tText.Tag()) ' indice della text cliccata
            Dim NomeText As String = tText.Name ' nome della Text
            tText.Text = "cliccato " & Indice.ToString("00")
            Me.Text = "riga " & Indice
        End Sub
    
        Private Sub Label1_OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
            ' solo d'esempio
            Dim a As System.EventArgs = e
            Dim lLabel As Label = CType(sender, Label) ' conversione esplicita da Object a Label
            Dim ClicX As Integer = lLabel.Left ' coordinata X della Label1 cliccata
            Dim ClicY As Integer = lLabel.Top ' coordinata Y della Label1 cliccata
            Dim Indice As Integer = Convert.ToInt16(lLabel.Tag()) ' indice della Label1 cliccata
            Dim NomeLabel1 As String = lLabel.Name ' nome della Label1
            lLabel.Text = "cliccato"
            Me.Text = "riga " & Indice
        End Sub
    
        Private Sub TimePick_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
            ' solo d'esempio
            Dim DTP As DateTimePicker = CType(sender, DateTimePicker) ' conversione esplicita da Object a DateTimePicker
            Dim Indice As Integer = Convert.ToInt16(DTP.Tag()) ' indice del DateTimePicker che ha cambiato data
            Label1(Indice).Text = "data cambiata"
            TextIN(Indice).Text = DTP.Value.Day & "/" & DTP.Value.Month & "/" & DTP.Value.Year
            Me.Text = "riga " & Indice
        End Sub
    
        Private Sub ButVisualizza_OnClick(sender As Object, e As EventArgs)
            ' visualizzazione di un numero scelto di controlli
            Dim quante As Integer = Convert.ToInt16(TextRIGHE.Text)
    
            For rig = 0 To TextIN.Count - 1
                If rig > quante Then TextIN(rig).Visible = False Else TextIN(rig).Visible = True
                If rig > quante Then Label1(rig).Visible = False Else Label1(rig).Visible = True
                If rig > quante Then TimePick(rig).Visible = False Else TimePick(rig).Visible = True
            Next
        End Sub
    End Class
  • Re: Oggetti del form dinamici

    Rubik ha scritto:


    andrea25 ha scritto:


    Facendo partire il codice non mi dava errori ma non mi intercettava nessuna datetimepicker. Sapreste per caso il motivo ?
    Dal codice che hai postato significa che non hai capito, se decidi di usare una lista di controlli, For Each non serve più, perché all'interno di ogni lista il tuo controllo lo raggiungi con l'indice non devi fare una ricerca.
    Se fai una lista di DateTimePicker, l'evento Click non si attiverà quando cambi la data, ma devi usare l'evento ValueChanged
    Ti posto un codice, prima di copiare e incollare in un altro programma cerca di capire perché fa quello che fa, cambiando valori disposizioni ecc ecc.
    Se capisci, poi sei in grado di modificare e ampliare quello che ho postato alle tue esigenze.
    Option Strict On
    
    Public Class Form1
    
        Dim TextIN As New List(Of TextBox) ' lista di Text
        Dim Label1 As New List(Of Label) ' lista di Label
        Dim TimePick As New List(Of DateTimePicker) ' lista di DateTimePicker
        Dim PanelConte As New List(Of Panel) ' lista di pannelli, ogni pannello conterrà una text e una label e un DateTimePicker
        Dim TextRIGHE As New TextBox
        Dim ButVisualizza As New Button
        Dim LabelSU As New Label
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            Me.Size = New Size(520, 554)
            Dim NumRighe As Integer = 49 ' numero di righe da creare a piacere
    
            ' preparazione form e pannelli
            ' aggiunta bottone text e label per scelta visualizzazione
            TextRIGHE.Text = NumRighe.ToString()
            TextRIGHE.Location = New Point(100, 12)
            TextRIGHE.Width = 30
            Me.Controls.Add(TextRIGHE)
            LabelSU.Text = "su " & NumRighe.ToString()
            LabelSU.Location = New Point(135, 16)
            Me.Controls.Add(LabelSU)
            ButVisualizza.Text = "Visualizza"
            ButVisualizza.Location = New Point(14, 10)
            AddHandler ButVisualizza.Click, AddressOf ButVisualizza_OnClick ' permette di avere l'evento click
            Me.Controls.Add(ButVisualizza)
    
            ' aggiunta FlowLayoutPanel
            Dim PanelScroll As New FlowLayoutPanel ' conterrà i PanelConte
            PanelScroll.Location = New Point(10, 40)
            PanelScroll.Size = New Size(Me.Width - 35, Me.Height - 90)
            PanelScroll.BorderStyle = BorderStyle.FixedSingle
            PanelScroll.Anchor = AnchorStyles.Left Or AnchorStyles.Bottom Or AnchorStyles.Top Or AnchorStyles.Right
            PanelScroll.AutoScroll = True
            Me.Controls.Add(PanelScroll)
    
            ' riempio tre Liste di controlli e li aggiungo al PanelConte ogni panelconte verrà aggiunto al PanelScroll
            For riga = 0 To NumRighe
                TextIN.Add(New TextBox) ' creo le textbox
                TextIN(riga).Name = "TexIN" & riga.ToString("00") ' nome composto
                TextIN(riga).Left = 10
                TextIN(riga).Top = 10
                TextIN(riga).Tag = riga ' fa comodo per risolvere l'indice
                AddHandler TextIN(riga).Click, AddressOf TextIN_OnClick ' permette di avere l'evento click
    
                Label1.Add(New Label) ' creo le label1
                Label1(riga).Name = "Label1" & riga.ToString("00") ' nome composto
                Label1(riga).Left = 120
                Label1(riga).Top = 10
                Label1(riga).Tag = riga ' fa comodo per risolvere l'indice
                Label1(riga).BackColor = Color.LightGray
                Label1(riga).TextAlign = ContentAlignment.MiddleCenter
                AddHandler Label1(riga).Click, AddressOf Label1_OnClick ' permette di avere l'evento click
    
                TimePick.Add(New DateTimePicker) ' creo i DateTimePicker
                TimePick(riga).Name = "Label2" & riga.ToString("00") ' nome composto
                TimePick(riga).Left = 230
                TimePick(riga).Top = 10
                TimePick(riga).Tag = riga ' fa comodo per risolvere l'indice
                TimePick(riga).BackColor = Color.WhiteSmoke
                TimePick(riga).AutoSize = True
                AddHandler TimePick(riga).ValueChanged, AddressOf TimePick_ValueChanged ' permette di avere l'evento ValueChanged
    
                PanelConte.Add(New Panel) ' creo un nuovo pannello contenitore
                PanelConte.Item(riga).Size = New Size(450, 40)
                PanelConte.Item(riga).BackColor = Color.DarkGray
                PanelConte.Item(riga).BorderStyle = BorderStyle.FixedSingle
                PanelConte.Item(riga).Controls.Add(TextIN(riga)) ' nel pannello contenitore aggiungo text
                PanelConte.Item(riga).Controls.Add(Label1(riga)) ' nel pannello contenitore aggiungo label
                PanelConte.Item(riga).Controls.Add(TimePick(riga)) ' nel pannello contenitore aggiungo DateTimePicker
                PanelScroll.Controls.Add(PanelConte.Item(riga)) ' nel FlowLayoutPanel aggiungo il pannello contenitore
            Next riga
    
            ' posso usare i cicli
            For rig = 0 To NumRighe
                Label1(rig).Text = "cliccami"
                TextIN(rig).Text = "scrivi su " & TextIN(rig).Name
            Next rig
        End Sub
    
        Sub TextIN_OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
            ' solo d'esempio
            Dim tText As TextBox = CType(sender, TextBox) ' conversione esplicita da Object a TextBox
            Dim ClicX As Integer = tText.Left ' coordinata X della text cliccata
            Dim ClicY As Integer = tText.Top ' coordinata Y della text cliccata
            Dim Indice As Integer = Convert.ToInt16(tText.Tag()) ' indice della text cliccata
            Dim NomeText As String = tText.Name ' nome della Text
            tText.Text = "cliccato " & Indice.ToString("00")
            Me.Text = "riga " & Indice
        End Sub
    
        Private Sub Label1_OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
            ' solo d'esempio
            Dim a As System.EventArgs = e
            Dim lLabel As Label = CType(sender, Label) ' conversione esplicita da Object a Label
            Dim ClicX As Integer = lLabel.Left ' coordinata X della Label1 cliccata
            Dim ClicY As Integer = lLabel.Top ' coordinata Y della Label1 cliccata
            Dim Indice As Integer = Convert.ToInt16(lLabel.Tag()) ' indice della Label1 cliccata
            Dim NomeLabel1 As String = lLabel.Name ' nome della Label1
            lLabel.Text = "cliccato"
            Me.Text = "riga " & Indice
        End Sub
    
        Private Sub TimePick_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
            ' solo d'esempio
            Dim DTP As DateTimePicker = CType(sender, DateTimePicker) ' conversione esplicita da Object a DateTimePicker
            Dim Indice As Integer = Convert.ToInt16(DTP.Tag()) ' indice del DateTimePicker che ha cambiato data
            Label1(Indice).Text = "data cambiata"
            TextIN(Indice).Text = DTP.Value.Day & "/" & DTP.Value.Month & "/" & DTP.Value.Year
            Me.Text = "riga " & Indice
        End Sub
    
        Private Sub ButVisualizza_OnClick(sender As Object, e As EventArgs)
            ' visualizzazione di un numero scelto di controlli
            Dim quante As Integer = Convert.ToInt16(TextRIGHE.Text)
    
            For rig = 0 To TextIN.Count - 1
                If rig > quante Then TextIN(rig).Visible = False Else TextIN(rig).Visible = True
                If rig > quante Then Label1(rig).Visible = False Else Label1(rig).Visible = True
                If rig > quante Then TimePick(rig).Visible = False Else TimePick(rig).Visible = True
            Next
        End Sub
    End Class
    Ho rivisto il codice e credo di aver capito, domani proverò.
    Tuttavia ho un dubbio:
    Nel ciclo in cui crei le txt, label ecc... il top e il left hanno sempre lo stesso valore fisso, per caso ciò comporta che quando io le creo questa andranno a sovrapporsi se io non cambio questi valori?
  • Re: Oggetti del form dinamici

    andrea25 ha scritto:


    Prego ma anche:
    
            For Each controllo In Panel1.Controls
                If TypeOf controllo Is Label Then
                    ' tuo codice .....
                End If
            Next
    è equivalente

    Sto riscontrando dei problemi con quel codice.
    Ho provato a farlo su dei datetimepicker piuttosto che delle label e non me le intercetta.
    Le mie datetimepicker si trovano all’interno del panel e io mio codice è:

    For i = 1 to n
    tag = “RIGA” & i

    for each controllo in panel.controls
    if controllo.gettype is gettype(datetimepicker) and controllo.tag is tag then
    data = CDate(controllo.text)
    end if
    next

    next


    Facendo partire il codice non mi dava errori ma non mi intercettava nessuna datetimepicker. Sapreste per caso il motivo ?
    Scusa se ho letto frettolosamente, la risposta precedente non è pertinente, ma la lascio perché amplia il discorso sulle liste dei contrtrolli.

    La sintassi giusta per fare quello che vuoi:
            For i = 1 To 10
                Dim DTP As New DateTimePicker
                DTP.Top = i * 20
                DTP.Name = "RIGA" & i.ToString("00")
                DTP.Tag = i
                Panel1.Controls.Add(DTP)
            Next i
    
            Dim cercaDTP As Integer = 3
    
            For Each controllo In Panel1.Controls
                If TypeOf controllo Is DateTimePicker And controllo.tag = cercaDTP Then
                     Me.Text = "La data nel DTP in " & controllo.name & " è " & controllo.value
                End If
            Next
  • Re: Oggetti del form dinamici

    andrea25 ha scritto:


    Ho rivisto il codice e credo di aver capito, domani proverò.
    Tuttavia ho un dubbio:
    Nel ciclo in cui crei le txt, label ecc... il top e il left hanno sempre lo stesso valore fisso, per caso ciò comporta che quando io le creo questa andranno a sovrapporsi se io non cambio questi valori?
    Si.
    Nel nuovo codice la text, label e datetimepicker, vanno in PanelConte, per cui le coordinate .Top sono sempre le stesse, poi sono i PanelConte che vanno in PanelScroll che avranno coordinate determinate in base al ridimensionamento dal FlowLayoutPanel.

    Se userai un panel unico devi incrementare le coordinate a tua necessità.
    Il Panel non lo chiamare panel, è ambiguo.
  • Re: Oggetti del form dinamici

    Rubik ha scritto:


    andrea25 ha scritto:


    Ho rivisto il codice e credo di aver capito, domani proverò.
    Tuttavia ho un dubbio:
    Nel ciclo in cui crei le txt, label ecc... il top e il left hanno sempre lo stesso valore fisso, per caso ciò comporta che quando io le creo questa andranno a sovrapporsi se io non cambio questi valori?
    Si.
    Nel nuovo codice la text, label e datetimepicker, vanno in PanelConte, per cui le coordinate .Top sono sempre le stesse, poi sono i PanelConte che vanno in PanelScroll che avranno coordinate determinate in base al ridimensionamento dal FlowLayoutPanel.

    Se userai un panel unico devi incrementare le coordinate a tua necessità.
    Il Panel non lo chiamare panel, è ambiguo.
    Va bene, grazie mille. proverò
  • Re: Oggetti del form dinamici

    Rubik ha scritto:


    andrea25 ha scritto:


    Prego ma anche:
    
            For Each controllo In Panel1.Controls
                If TypeOf controllo Is Label Then
                    ' tuo codice .....
                End If
            Next
    è equivalente

    Sto riscontrando dei problemi con quel codice.
    Ho provato a farlo su dei datetimepicker piuttosto che delle label e non me le intercetta.
    Le mie datetimepicker si trovano all’interno del panel e io mio codice è:

    For i = 1 to n
    tag = “RIGA” & i

    for each controllo in panel.controls
    if controllo.gettype is gettype(datetimepicker) and controllo.tag is tag then
    data = CDate(controllo.text)
    end if
    next

    next


    Facendo partire il codice non mi dava errori ma non mi intercettava nessuna datetimepicker. Sapreste per caso il motivo ?
    Scusa se ho letto frettolosamente, la risposta precedente non è pertinente, ma la lascio perché amplia il discorso sulle liste dei contrtrolli.

    La sintassi giusta per fare quello che vuoi:
            For i = 1 To 10
                Dim DTP As New DateTimePicker
                DTP.Top = i * 20
                DTP.Name = "RIGA" & i.ToString("00")
                DTP.Tag = i
                Panel1.Controls.Add(DTP)
            Next i
    
            Dim cercaDTP As Integer = 3
    
            For Each controllo In Panel1.Controls
                If TypeOf controllo Is DateTimePicker And controllo.tag = cercaDTP Then
                     Me.Text = "La data nel DTP in " & controllo.name & " è " & controllo.value
                End If
            Next
    Non funziona il controllo su controllo.tag quando utilizzo una variabile...
    se faccio if controllo.tag is "RIGA1" funziona perfettamente.

    ma se faccio
    variabile= "RIGA1"
    if controllo.tag is variabile

    in questo caso non me lo prende...
  • Re: Oggetti del form dinamici

    andrea25 ha scritto:



    Non funziona il controllo su controllo.tag quando utilizzo una variabile...
    se faccio if controllo.tag is "RIGA1" funziona perfettamente.

    ma se faccio
    variabile= "RIGA1"
    if controllo.tag is variabile

    in questo caso non me lo prende...
    non puoi usare una variabile String dopo Is che è Object e serve per verificare l'identità di un controllo

    Non devi usare Is ma =
    Ti posto un codice che invece del tag, inutile in questo caso, indispensabile invece quando si usano le liste dei controlli, usa il nome del controllo.
    Quando aggiungi i datetimepicker nel panel gli assegni un nome progressivo.
            For i = 1 To 10
                Dim DTP As New DateTimePicker
                DTP.Top = i * 20
                DTP.Name = "RIGA" & i.ToString("00") ' nome progressivo, RIGA01, RIGA02, ... RIGA10
                Panel1.Controls.Add(DTP)
            Next i
    
            Dim cercaDTP As String = "RIGA02" ' controllo da cercare
    
            For Each controllo In Panel1.Controls.OfType(Of DateTimePicker)()
                ' ricerca per nome
                If controllo.Name = cercaDTP Then
                    Me.Text = "La data nel DTP in " & controllo.Name & " è " & controllo.Value
                End If
            Next
    
Devi accedere o registrarti per scrivere nel forum
26 risposte