Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

.ΝΕΤ 2.0 Databinding και CheckedListBox

Îåêßíçóå áðü ôï ìÝëïò cap. Τελευταία δημοσίευση από το μέλος cap στις 14-12-2006, 14:56. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  13-12-2006, 18:19 22155

    .ΝΕΤ 2.0 Databinding και CheckedListBox

    Πειραματίζομαι λίγο με το databinding και γι'αυτό σας προειδοποιώ οτι μπορει η απορία να είναι κουφή/γελοία/αστεία. Να σας αναφέρω το σενάριο:

    Εχω μια κλάση Document. Αυτή έχει διάφορα properties, ένα εκ των οποίων είναι το Sectors που ουσιαστικά είναι ένα List (of Sector) αντικειμένων.

    Θελοντας να "δεσω" αυτό το αντικείμενο με το UI μου κάνω ωραία πράγματα όπως το παρακάτω:



     Private _d As Document  'Καπου αυτό γεμίζει, δεν συμπεριλαμβάνω το σχετικό κώδικα μια και δεν αφορά την ερώτηση
        Private Sub frmDocument_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Me.txtTitle.DataBindings.Add("text", _d, "title")
            Me.dtFrom.DataBindings.Add("value", _d, "dateup")
            Me.dtTo.DataBindings.Add("value", _d, "datedown")
            Me.txtSummary.DataBindings.Add("text", _d, "summary")
           ' ... (και άλλα τέτοια)

        End Sub

    Γεμίζοντας τώρα ένα CheckedListBox με datasource = ένα List (of Sectors) θέλω να δείξω τους Sectors για το τρέχον αντικείμενο _d τσεκάροντάς τους. Υπόψιν οτι το CheckedListBox (ας πούμε lstSectors) περιέχει ΟΛΑ τα διαθέσιμα Sector objects ενώ το _d.Sectors ΜΟΝΟ εκείνα στα οποία ανήκει το συγκεκριμένο Document instance. Και φυσικά, αν αλλάξω τις επιλογές μου, να ενημερωθεί και το _d.

    Θελω να χρησιμοποιήσω DataBindings και όχι custom code. Μπορώ να το κάνω με κάποιον τρόπο;

    ΣΗΜΕΙΩΣΗ: Για binding απλού object σε Combobox το έχω επιτύχει. Το Document class έχει άλλο ένα Property, το CallOwner, το οποίο είναι ένα Organization object. Εκεί λοιπόν αν κάνω τα εξής:

            Me.cmbCallOwner.DataSource = _objOrgMgr.Load() 'Δεν εχει σημασία πως, γεμίζει με ένα List (of Organization)
            Me.cmbCallOwner.DisplayMember = "title"
            Me.cmbCallOwner.ValueMember = "id"

    και μετά:

    Me.cmbCallOwner.DataBindings.Add("selectedvalue", _d, "callowner.id")

    Πετυχαίνω ένα 2-way databinding. Με το CheckedListBox όμως δεν μπορώ να επιτύχω το ίδιο. Βοήθεια;


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
    Δημοσίευση στην κατηγορία: ,
  •  13-12-2006, 18:25 22156 σε απάντηση της 22155

    Απ: .ΝΕΤ 2.0 Databinding και CheckedListBox

    Εεε, συμπλήρωση: Φυσικά το CheckedListBox έχει τη δυνατότητα επιλογής περισσότερων από ενός Sectors.
    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  13-12-2006, 19:03 22158 σε απάντηση της 22156

    Απ: .ΝΕΤ 2.0 Databinding και CheckedListBox

    Γεια σου cap.

    Πριν αρχίσω να σου προτείνω την λύση μου θα ήθελα να επαναλάβω αυτά που έγραψες για να δούμε αν έχω καταλάβει καλά αυτά που γράφεις.

    Κάθε organization objects που έχεις περιέχει κάποια documents objects και τα documents objects περιέχουν sectors.

    Έχεις μία φόρμα από την οποία ας πούμε ότι επιλέγεις organizations με βάση το organization που έχουν επιλεγεί βλέπεις τα documents που αντιστοιχούν στο organization αυτό και όσο για τα sectors έχεις ένα checklistbox όπου περιέχει όλα τα καταχωρημένα sectors ανεξάρτητα του document το οποίο έχεις επιλέξει αλλά με τσεκαρισμένα μόνο τα sectors που ανήκουν σε αυτό το document.

    Οπότε θέλεις από εκεί να ξετσεκάρεις ή να τσεκάρεις sectors και ανάλογα να ενημερώνεται το document.

    Κάτι τέτοιο θα ήθελες να κάνεις;
  •  13-12-2006, 19:12 22160 σε απάντηση της 22158

    Απ: .ΝΕΤ 2.0 Databinding και CheckedListBox

    Σχεδόν σωστά.

    Εχω ένα Document object που περιέχει ΕΝΑ Organization object (το οποίο το αναφέρω μόνο για να δείξω οτι μπόρεσα να το κάνω bind σε ένα combobox) και ένα Collection (of Sectors).

    Τα υπόλοιπα που λες για τα sectors είναι σωστά. EDIT: Sector και Organization δεν σχετίζονται, αν αυτό σε μπέρδεψε.


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  13-12-2006, 21:16 22166 σε απάντηση της 22160

    Απ: .ΝΕΤ 2.0 Databinding και CheckedListBox

    Μετά από σκέψη κατέληξα ότι η λύση που μου αρέσει καλύτερα είναι να:
    • Κάνεις subclass το CheckedListBox
    • Πανωγράψεις (new) την CheckedItems, ώστε να είναι { get; set; } Στην get καλεί την base.CheckedItems.get. Στην set γεμίζει το CheckedItems καταλλήλως. Προσοχή: οι έλεγχοι της ισότητας με Object.Equals και όχι με ==.
    • Υλοποιήσεις σωστά στο Sector την ToString() και την Equals
    • Γεμίζεις το CheckedListBox απευθείας με Sector objects.
    • Κάνεις databind το Document.Sectors με το BindableCheckedListBox.CheckedItems
    • Υλοποιήσεις σωστά το set στο Document.Sectors.
    Μου φαίνεται ότι θα παίξει. Δεν το δοκίμασα, έτσι;

    Νατάσα Μανουσοπούλου
  •  13-12-2006, 23:28 22171 σε απάντηση της 22166

    Απ: .ΝΕΤ 2.0 Databinding και CheckedListBox

    Από ο,τι κατάλαβα δεν υπάρχει απευθείας τρόπος, ετσι;

    Το σκέφτηκα για subclassing αλλά μου φάνηκε too much για ένα και μόνο checkedlistbox που θα χρησιμοποιηθεί σε μια εφαρμογούλα. Ομως, ίσως να το κανω για να το έχω για αργότερα σε πιό μεγάλα "κόλπα".

    Δεν ξέρω τα internals του databinding και δεν είμαι σίγουρος οτι θα παίξει η readwrite CheckedItems με αυτό τον τρόπο...


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  13-12-2006, 23:41 22174 σε απάντηση της 22160

    Απ: .ΝΕΤ 2.0 Databinding και CheckedListBox

    Το κλείνω ως απαντημένο, παρ'όλα αυτά αν κάποιος συνάδελφος έχει κάποια διαφορετική άποψη σχετικά με το αν μπορεί να επιτευχθεί databinding χωρίς subclassing και custom code, ας μας το πει. Ευχαριστώ Νατάσα!


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  13-12-2006, 23:43 22175 σε απάντηση της 22174

    Απ: .ΝΕΤ 2.0 Databinding και CheckedListBox

    Ωχ. Ξεχάστηκα. Περιμένω τον infoCENTER. Θα χαρώ πολύ να ακούσω και τη δική σου άποψη, ε; Αναμένω!


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  14-12-2006, 14:48 22217 σε απάντηση της 22175

    Απ: .ΝΕΤ 2.0 Databinding και CheckedListBox

    Γεια σας και από εμένα. Συγνώμη για χθες αλλά είχα δουλειά και έπρεπε να φύγω.

    Διάβασα την λύση της Νατάσσας. Να πω την αλήθεια το ίδιο σκέφτηκα και εγώ αρχικά.

    Το control έτσι όπως είναι δεν μπορεί να υλοποιήσει αυτό που θες. Ουσιαστικά χρειάζεσαι 2 datatables. Ένα για να φέρεις όλα τα sectors και να κάνεις Bind το checklistbox με αυτό και ένα δεύτερο datatable για να κρατήσεις τα sectors που σχετίζονται με τα documents. Το checklistbox έχει μόνο ένα datasource & datamember property οπότε... αυτό που σου μένει είναι να υλοποιήσεις το δικό σου checklistbox.

    Αν το θεωρείς μεγάλο κόπο μπορείς να κάνεις το εξής πιο άμεσο θα έλεγα. Να παρακολουθείς δύο events. Το ένα είναι το CurrencyManager.PositionChanged event για να δεις ποια sectors περιέχει αυτό το document, φορτώνοντας το σχετκό datatable και ανάλογα να κάνεις manually check. Και το δεύτερο event είναι να παρακολουθείς CheckedListBox.ItemClick για να ενημερώνεις το datatable.
  •  14-12-2006, 14:56 22218 σε απάντηση της 22217

    Απ: .ΝΕΤ 2.0 Databinding και CheckedListBox

    Ευχαριστώ. Ουσιαστικά τώρα που απαντήσατε και οι δυο μας πήρα την απάντησή μου στο (βασικό) αρχικό ερώτημα, οτι δεν κάνω εγώ κάτι λάθος και οτι το databinding που θέλω δεν είναι εφικτό τουλάχιστον απευθείας.

    Η λύση με τον CurrencyManager είναι custom, και ως τέτοια είναι μεν καλή, αλλά πιό αποτελεσματική σε χρόνο (επειδή τυγχάνει η εφαρμογή αυτή να μην είναι κάτι το μεγάλο) είναι η υλοποίηση custom απλού κώδικα - και για τον επιπλέον λόγο οτι το binding γίνεται σε objects και όχι σε datatables. (traverse το list - βρες από το list έχει το object χρησιμοποιώντας equals() ή το id property - εγω έφτιαξα την equals() - τσέκαρε αυτά που έχει το επιλεγμένο document) και αντίστοιχα και στην αποθήκευση.

    Το subclassing είναι μακράν η πιό αποτελεσματική και reusable λύση, ομολογουμένως. Ευχαριστώ για τις απόψεις σας!


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems