Newsgroup: it.comp.lang.visual-basic
Titolo: Array di oggetti (e.g. Button) su un Form in VB .NET

Il vecchio caro VB6 dava l'opzione, se si faceva  copy&paste di un 
oggetto esistente (ad esempio Button1) di scegliere tra una serie
di button numerati semplicemente (Button1, Button2, Button3) oppure un 
array di Button (Button(1), Button(2), Button(3).
Questa opzione non la vedo sul VB Express 2010 (e nemmeno sul 2008).
Devo costruire una form con 50 button e non voglio ritrovarmi con button 
numerati da Button1.....fino a Button50.
Voglio Button(1)....fino a Button(50).
Come si fa ad ottenere ciò ???

 ha scritto nel messaggio 
news:i563n0$g4n$1...@nnrp.linuxfan.it...

Puntualmente ogni mese salta fuori questa domanda (o una molto simile)... da 
8 anni a questa parte!
Risposta: NON SI PUÒ perché gli array di controlli in 
VB.NET
 *non esistono*.
A cosa ti serve precisamente avere un così grande numero di button?
Fammi capire, magari ci sono approcci diversi e possibilità che non 
esistevano in VB6.
Tanto per dirne una, se i bottoni sono disposti tipo "pulsantiera" in una 
griglia, potresti usare una DataGridView con colonne di tipo ButtonColumn.
Bye
Raf
 

 ha scritto nel messaggio 
news:i563n0$g4n$1...@nnrp.linuxfan.it...

ciao
Questo è un esempio di  un riquadro di bottoni standard 10*9
90 button  da premere  al load di un fom ''ricerche''
Private Sub ricerche_Load(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles MyBase.Load
Dim i, AR, HR As Integer, inizioX As Integer = 30, inizioY As Integer = 30, 
stepX As Integer, stepY As Integer
For i = 1 To 90
Dim newCella As New Button
newCella.Name = i.ToString()
stepY = Int((i - 1) / 10)
stepX = i - 1 - stepY * 10
newCella.Location = New Point(inizioX + stepX * 24, inizioY + stepY * 24)
newCella.MinimumSize = New Point(24, 24)
newCella.MaximumSize = New Point(24, 24)
newCella.Size = New Point(24, 24)
newCella.Font = New Font(Font.FontFamily, 8)
newCella.TextAlign = 1
' newCella.Text = i.ToString()
Controls.Add(newCella)
command3d3(i) = newCella
command3d3(i).TabIndex = i
command3d3(i).Tag = i
command3d3(i).Text = i
AddHandler command3d3(i).Click, AddressOf Me.BUTTON1Click
' AddHandler text1(i).KeyPress, AddressOf Me.text1KeyPress
Next
end sub
e qui la funzione di quando premi un qualsiasi button  e ne cambia forecolor 
(black/ red)
Private Sub BUTTON1Click(ByVal sender As Button, ByVal e As 
System.EventArgs)
Dim indice As String
indice = sender.Text
If command3d3(indice).ForeColor = Color.Red Then
NU(indice) = 0
command3d3(indice).ForeColor = Color.Black
Else
NU(indice) = 1
command3d3(indice).ForeColor = Color.Red
End If
End Sub


proprio per quello mi occorrono : come pulsantiera.
A me sembra però che usare una dataGridView sia una 'lungatoia' (opposto 
a 'scorciatoia') non necessaria. Non vedo la difficoltà ad avere un 
array di oggetti.
Cosa sta dietro a questa logica ?


ottima 'scorciatoia' ! Grazie !!!  :-)))

john schrieb:
dopo aver attentamente esaminato i suggerimenti di Maximo E Rafunk, mi 
sto chiedendo cosa sia più efficiente dal punto di vista della 'code 
readibility' e quindi maintenance (fatta da altre persone che verranno 
dopo) e magari dal punto di vista anche della velocità di esecuzione.
Sembrerebbe strano, ma il fare copy & paste dell'oggetto cinquanta volte 
(cioè avere una serie di Button1...fino a Button50) separati, che magari 
prendono 150 linee in più di code (dichiarazione e per gli event 
handles) mi sembra che sia la via più 'leggibile' (dell'algoritmo di 
Maximo) e più 'semplice' del DataGridView, che obbligherebbe ad ogni 
modo di creare un DataSet da 'linkare' al DataGrid, noché all'estetica, 
migliore IMHO nei Button.
Voi che ne pensate ???

 Voi che ne pensate ???
vedi questo codice buttato giù al volo.
Secondo il tipo di posizionamento invece di utilizzare location , potresti 
aggiungere i pulsanti all'interno di un controllo tipo flowlayoutpanel
Ciao
for i=0 to 50
dim a as new button
a.name
=i.tostring
a.location=new Point(x,y)
a.text="quel che vuoi"
form1.controls.add(a)
next 

 next
leggibilissimo. Grazie. Vado subito a provarlo.

 ha scritto nel messaggio 
news:i56l22$sam$1...@nnrp.linuxfan.it...

A parte che non sei obbligato a bindare un dataset alla dgvw (puoi creare 
colonne e righe autonomamente, alimentando quest'ultime con un semplice 
array di stringhe).
Il mio suggerimento di usare quel controllo anziché 50 bottoni deriva dalla 
considerazione che piuttosto che gestire N controlli uguali, in certi casi è 
meglio 1 unico controllo...
Prova questo codice, aggiungi solo una DataGridView ad un form nuovo, 
chiamandola KeypadGrid:
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles MyBase.Load
        SetupKeypadGrid()
    End Sub
    Private Sub SetupKeypadGrid()
        With KeypadGrid
            ' Questa parte disegna il layout della grid, ma può anche essere 
impostata a design-time
            .AllowUserToAddRows = False
            .CellBorderStyle = 
System.Windows.Forms.DataGridViewCellBorderStyle.None
            .ColumnHeadersVisible = False
            .Dock = DockStyle.Fill
            .ReadOnly = True
            .RowHeadersVisible = False
            .RowTemplate.MinimumHeight = 48
            .ScrollBars = System.Windows.Forms.ScrollBars.None
            Dim cellStyle As New DataGridViewCellStyle
            cellStyle.Alignment = 
System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter
            cellStyle.BackColor = System.Drawing.SystemColors.ButtonFace
            cellStyle.ForeColor = System.Drawing.SystemColors.ControlText
            cellStyle.SelectionBackColor = cellStyle.BackColor
            cellStyle.SelectionForeColor = cellStyle.ForeColor
            cellStyle.WrapMode = 
System.Windows.Forms.DataGridViewTriState.[False]
            .DefaultCellStyle = cellStyle
            For col = 0 To NumCols - 1
                Dim columnName As String = String.Format("Column{0}", col)
                Dim column As New DataGridViewButtonColumn
                column.AutoSizeMode = 
System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill
                column.DataPropertyName = columnName
                column.ReadOnly = True
                column.Resizable = 
System.Windows.Forms.DataGridViewTriState.[False]
                column.Name = columnName
                .Columns.Add(column)
            Next
            ' Questa parte invece va per forza codificata esplicitamente
            For row = 0 To NumRows - 1
                Dim rowData(NumCols - 1) As String
                For col = 0 To NumCols - 1
                    rowData(col) = String.Format("({0},{1})", col, row)
                Next
                .Rows.Add(rowData)
            Next
        End With
    End Sub
    Private Sub KeypadGrid_CellClick(ByVal sender As Object, ByVal e As 
System.Windows.Forms.DataGridViewCellEventArgs) Handles KeypadGrid.CellClick
        MessageBox.Show(String.Format("You clicked cell ({0},{1})", 
e.ColumnIndex, e.RowIndex))
    End Sub
Bye
Raf 

 aggiungere i pulsanti all'interno di un controllo tipo flowlayoutpanel
Io ho appena fatto uno usercontrol che ha un flowlayoutpanel e ci inserisce
#n checkbox in stile button. (mi serve per una cosa specifica)
Poi ho aggiunto un paio di proprietà per restituire/resettare i valori
selezionati e via.


Grazie.
Vado a provare anche questa. Intanto sono in 'design philosophy phase' :-)))

 Voi che ne pensate ???
Che se ci si adegua "al basso"...si finisce per fare porcate da
"basso".
Se chi viene dopo di te non sà usare addHandler o robe simili perchè
nasce come cobolista e rimane ancorato al suo mondo(ad esempio).....eh
beh!
Con codesta filosofia si sarebbe ancora a cercare la "quintessenza" ed
a bruciare le streghe!
Sviluppa al massimo delle tue possibilità...è anche un modo per
aumentare la cultura generale...e tenersi stretto il cliente!
Utile + dilettevole...che vuoi di più? Un lucano?
;-)