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