Υποθέτω ότι αναφέρεσαι σε αυτό που κάναμε παλιότερα στη VB 6, να ορίσεις δηλαδή control arrays και να αναφέρεσαι μέσω ενός index σε κάποιο control μέσα από μια ομάδα. Πχ textbox(i).text=”” για να κάνεις reset το text σε όλα τα textboxes.
Στη VB.NET δεν υποστηρίζονται control arrays. Ωστόσο, μπορείς να κάνεις ένα σωρό κόλπα για να αντικαταστήσεις αυτή τη λειτουργικότητα και μάλιστα με πιο κομψό τρόπο. Για παράδειγμα, μπορείς να ομαδοποιήσεις όλα τα controls που σε ενδιαφέρουν σε ένα ArrayList και κατόπιν να κάνεις ένα iteration σε όλα τα items για να καλέσεις κάποιο method ή να ορίσεις κάποιο property. Πχ
Dim ButtonList As New ArrayList
ButtonList.Add(Button1)
ButtonList.Add(Button2)
ButtonList.Add(Button3)
For Each btn As Button In ButtonList
btn.Enabled = False
Next
Το ωραίο είναι ότι με αυτόν τον τρόπο μπορείς να ορίσεις collections από διάφορα controls που όλα μοιράζονται κάποιο κοινό property ή method. Σε περίπτωση που έχεις ένα control array από διάφορα controls και θέλεις να κάνεις κάτι μόνο σε κάποια από αυτά, μπορείς να κάνεις το εξής
Dim ButtonList As New ArrayList
ButtonList.Add(Button1)
ButtonList.Add(Button2)
ButtonList.Add(Button3)
ButtonList.Add(TextBox1)
ButtonList.Add(TextBox2)
For Each ctrl As Control In ButtonList
If TypeOf ctrl Is TextBox Then
CType(ctrl, TextBox).ReadOnly = False
End If
Next
Όπου βασικά τα θεωρείς όλα controls και ελέγχεις τον τύπο τους, οπότε μόνο αν σου κάνει, τα μετατρέπεις σε αυτό που θέλεις (Ctype) και κατόπιν τα χειρίζεσαι όπως θέλεις.
Τέλος, για να πίασεις ένα event από μια ομάδα controls, μπορείς να κάνεις το παρακάτω:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
End Sub
Όπου πλέον μέσα στην procedure χρησιμοποιείς το sender object για να βρεις ποιο από τα controls προκάλεσε το event. Π.χ.
MessageBox.Show(CType(sender, Button).Name)
για να πάρεις το όνομα του control.
Αν έχεις πολλά controls τα οποία είτε δημιουργείς δυναμικά με τον κώδικά σου, είτε βαριέσαι να γράφεις στο handles του Button1_Click, μπορείς να συνδέσεις το event με την procedure με χρήση κώδικα:
AddHandler Button3.Click, AddressOf Button1_Click
Πρόσεξε μην ξεχάσεις το AddressOf. Και πάλι, μπορείς να βάλεις τον ίδιο event handler να χειρίζεται διαφορετικά events από το ίδιο controls ή άλλα controls. Πχ
AddHandler RadioButton1.CheckedChanged, AddressOf CheckedChanged
AddHandler RadioButton2.CheckedChanged, AddressOf CheckedChanged
AddHandler CheckBox1.CheckedChanged, AddressOf CheckedChanged
Ο μόνος περιορισμός είναι να είναι συμβατά τα ορίσματα του event handler procedure, δηλαδή το
Private Sub Button1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Button1.KeyPress
End Sub
και το
Private Sub Button1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Button1.KeyDown
End Sub
όπως παρατηρείς έχουν διαφορετικό τύπο του e ορίσματος και άρα τα αντίστοιχα event χρειάζονται το καθένα τον δικό του handler.
Αυτά τα ολίγα και γενικά. Αν χρειαστείς κάτι συγκεκριμένο εδώ είμαστε…
Vir prudens non contra ventum mingit