Advanced data binding σε object collections

Έχουν δημοσιευτεί 18 Απριλίου 07 09:48 πμ | KelMan 

Πρόσφατα, χρειάστηκε να υλοποιήσω μια φόρμα που σίγουρα θα την έχετε συναντήσει αρκετές φορές. Η φόρμα έχει δύο listbox. Ο χρήστης επιλέγει items από την αριστερή και τα ρίχνει στην δεξιά μέσω drag'n'drop ή μέσω buttons που υπάρχουν ανάμεσα στα δύο listbox.

 

Στην δική μου περίπτωση, ουσιαστικά πρόκειται για τα ίδια data και απλώς τα items που εμφανίζονται στην δεξιά φόρμα είναι το υποσύνολο όλων αυτών που υπάρχουν στην αριστερή, με όλη όλη διαφορά ένα flag-πεδίο που γίνεται set.

 

Σκέφτηκα λοιπόν, ότι η λύση είναι απλή. Θα βάλω δύο BindingSource components πάνω στο ίδιο DataSource με τη διαφορά ότι το δεύτερο BindingSource θα έχει το κατάλληλο φίλτρο στο Filter property ώστε να παίρνω μόνο τα "selected" data. Κατόπιν, το μόνο που χρειάζεται είναι να κάνω bind το κάθε ListBox στο ανάλογο BindingSource.

 

Σωστά;

 

Not so fast…

 

Όλα τα παραπάνω είναι ωραία και καλά όμως όταν τα data βρίσκονται σε DataTable. Όταν βρίσκονται σε BindingList όπως στην περίπτωσή μου, τότε υπάρχει ένα σοβαρό πρόβλημα…

 

Κάθε φορά που ορίζουμε ένα BindingSource πάνω σε ένα DataTable, ουσιαστικά το BindingSource παίζει πάνω στο DefaultView property του DataTable. To DefaultView property είναι τύπου DataView και το DataView είναι αυτό που ευθύνεται για το DataBinding και κάνει δύο δουλειές που μας ενδιαφέρουν: Ταξινομεί και φιλτράρει τα data του DataTable. Μπορούμε να ορίσουμε πολλαπλά DataViews πάνω σε ένα DataTable:

 

Dim newView As New DataView(Me.NorthwindDataSet.Products)

 

και να κάνουμε bind οποιοδήποτε control πάνω σε αυτό το νέο DataView.

 

Το πρόβλημα λοιπόν που λέγαμε είναι ότι το DataView είναι φτιαγμένο μόνο για DataTables. Δεν μπορούμε να ορίσουμε DataView για ένα BindingList! Αυτό το πρόβλημα με απασχολούσε εδώ και καιρό ωστόσο δεν το αποφάσιζα να υλοποιήσω το δικό μου DataView γιατί απαιτείται αρκετή δουλειά και χρόνο για ένα τέτοιο εγχείρημα. Θα πρέπει να υλοποιηθούν μια σειρά από interfaces με κυριότερο το IBindingList.

 

Έτσι λοιπόν, όταν δούλευα στην φόρμα που σας περιέγραψα, πήρα απόφαση να το φτιάξω το ρημάδι το Custom-View. Ψάχνοντας όμως για documentation, προς μεγάλη μου έκπληξη, βρήκα έναν καλό άνθρωπο, ονόματι Jesse Johnston που το έχει υλοποιήσει! Το έχει ονομάσει ObjectListView και μπορείτε να το βρείτε εδώ: http://www.teamjohnston.net/Downloads.aspx. Επιπρόσθετα, στο blog του έχει όλες τις λεπτομέρειες για την κατασκευή του.

 

Το χάρηκα πολύ γιατί με αυτό το component είναι εφικτό το advanced data binding σε object collections, η μη-αλφαριθμητική ταξινόμησή των objects όπως επίσης και η δυνατότητα πολύπλοκου filtering καθώς υποστηρίζει filter predicates.

 

Enjoy!

 

Σχόλια:

Χωρίς Σχόλια
Έχει απενεργοποιηθεί η προσθήκη σχολίων από ανώνυμα μέλη

Search

Go

Συνδρομές