Ο Walker που κάνει το Loop του InfoCENTER, δεν είναι και πολύ διαφορετικός από αυτόν του Class. Απλά το function αυτό (EnumarateControls) το βάλαμε σε ένα Class που έχει ένα property Controls Collection, έτσι ώστε μέσα σε κάθε φόρμα να μήν με απασχολεί να μαζέψω τα controls αλλά να τα διαχειριστώ ανάλογα με τις ανάγκες της φόρμας.
Πιο κάτω είναι μία πιο απλή εναλλακτική λύση, με ενσωμάτωση της πρότασης του InfoCENTER, μόνο που αντί να κάνω clear το text το βάζω στο Collection _Controls, ενώ κάνω walk μόνο τα Controls όπως GroupBox, Panel, TabPage κλπ.
Public
Class MyControlsCollection
Private _Controls As Collection
Public Sub New(ByVal Container As Object)
_Controls = New Collection
EnumerateControls(Container.Controls)
End Sub
Public ReadOnly Property Controls() As Collection
Get
Return _Controls
End Get
End Property
Public Sub EnumerateControls(ByVal a_Controls As Control.ControlCollection)
For Each control As Control In a_Controls
_Controls.Add(Control, Control.Name)
If IsContainer(control) AndAlso control.HasChildren Then
EnumerateControls(control.Controls)
End If
Next
End Sub
Private Function IsContainer(ByVal ctl As Object) As Boolean
Dim des As System.ComponentModel.DesignerAttribute = _
TypeDescriptor.GetAttributes(ctl).Item(GetType(System.ComponentModel.DesignerAttribute))
If des Is Nothing Then return false
Dim Base As System.Type = System.Type.GetType(des.DesignerTypeName.ToString)
Return Base.IsSubclassOf(GetType(System.Windows.Forms.Design.ParentControlDesigner))
End Function
End
Class
Αυτός κατά τη γνώμη μου είναι ο απλούστερος τρόπος να διαχειριστεί κανείς σωστά το Controls Collection ενός Container.
ClearText:
Κατά την άποψή μου ο σωστότερος (όχι όμως και ο απλούστερος) τρόπος που εφαρμόζω στις δικές μου εφαρμογές για το Clear Text είναι ο εξής:
Δημιουργείς ένα control Inherits TextBox ή οτιδήποτε άλλο (πχ third party) που θέλεις να καθαρίζεται και το μαρκάρεις με ένα δικό σου Attribute έστω myAttribute στο οποίο μπορείς να βάλεις οποιοδήποτε property ανάλογα με τις ανάγκες σου.
Στο πιο πάνω Class βάζεις ένα function ClearText και στο loop ελέγχεις :
if Not TypeDescriptor.GetAttributes(ctl).Item(GetType(MyAttribute)) is Nothing then
ctl.text = ""
end if
Επειδή όμως μου αρέσει πολύ (και έχει αποδειχθεί πολύ χρήσιμο) να διατηρώ Components όσο πιο core γίνεται, εγώ θα έκανα Overridable το EnumarateControls και θα δημιουργούσα ένα νέο Class (Inherits το MyControlsCollection).
Μέσα σε αυτό το Class θα έκανα Override το EnumerateControls έτσι ώστε να μαζεύει μόνο τα Controls με το MyAttribute, και ένα Public method ClearControls. Στο Construction θα του πέρναγα το Controls.Collection του MyCOntrolsCollection, κάπως έτσι:
Dim ClearTextControls = New InheritedMyCollection(AllControls)
ClearTextControls.ClearText
Θα προσπαθήσω όταν βρώ λίγο χρόνο να κάνω ένα post με τον πλήρη κώδικα αυτής της λύσης.
Σταύρος Βαλσάμης
Προγραμματιστής