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

 

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

Συγχρονισμός δεδομένων σε φόρμα (bindingsources and comboboxes)

Îåêßíçóå áðü ôï ìÝëïò Azular. Τελευταία δημοσίευση από το μέλος Azular στις 12-11-2007, 16:00. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  08-11-2007, 15:52 37086

    Συγχρονισμός δεδομένων σε φόρμα (bindingsources and comboboxes)

    Παιδία έχω τους εξής πίνακες σε ενα Dataset:
    NOMOS
    DHMOS
    OIKISMOS
    Οι πίνακες αυτοί συνδέονται μεταξύ τους με σχέσεις ένα προς πολλά (Ο νομός έχει δήμους, Ο δήμος έχει οικισμούς).
    Επίσης υπάρχει ένας άλλος πίνακας KATASTHMATA. Ο πίνακας αυτός συνδέεται με τον πίνακα OIKISMOS (Ο οικισμός έχει Καταστήματα).

    Στην συνέχεια σε μία φόρμα όπου διαχειρίζομαι τα δεδομένα του κάθε καταστήματος φτίαχνω τα απαραίτητα BindingSource (με βάση τις σχέσεις των πινάκων) και 3 comboboxes ορίζοντας ως datasource αυτών τα αντίστοιχα Bindinsource.
    Έτσι έχουμε ένα combobox με τους νομούς, ένα με τους δήμους και ένα με τους οικσιμούς με σκοπό να προσδιορίζει ο χρήστης το κατάστημα γεωγραφικά.
    Επιλέγοντας στο πρώτο combobox έναν νομό φιλτράρονται στο δεύτερο combobox οι αντίστοιχοι δήμοι και επιλέγοντας δήμο φιλτράρονται οι αντίστοιχοι οικισμοί του επιλεγμένου δήμου στο τρίτο combobox.Μέχρι εδώ όλα φίνα.Το πρόβλημα το έχω μετά.
    Στο τρίτο combobox (όπου υπάρχουν οι Οικισμοί) κάνω binding ώστε η SelectedValue να συνδέεται με τα δεδομένα του Καταστήματος και πιο συγκεκριμένα με το πεδίο όπου αποθηκευεται ο κωδικός Οικισμού. Οι τιμές βέβαια περνάνε κανονικά στο αντίστοιχο πεδίο ανάλογα με την επιλογή του Οικισμού.Έτσι κατοχωρύνεται σε ποιον οικισμό ανήκει ένα κατάστημα.
    Το πρόβλημα υπάρχει στον συγχρονισμό των δεδομένων.
    Όταν ο χρήστης ανοίξει πάλι την φόρμα τα δεδομένα στα combobox δεν συγχρονίζονται. Δηλαδή δεν φαίνεται ούτε ο νομός, ούτε ο δήμος ούτε ο οικισμός που έχει το κατάστημα (παρόλα αυτά ο κωδικός οικισμού έχει καταχωρηθεί κανονικά στο αντίστοιχο πεδίο του καταστήματος). Θεώρησα ότι με το binding του πεδίου θα συγχρονίζονταν τα combobox.Να σημειώσω ότι στα καταστήματα υπαρχει πεδίο μόνο για τον οικισμό και όχι για τον δήμο και τον Νομό.Υπάρχει κάποιο παράδειγμα σχετικά με μια τέτοια περίπτωση;Καμία ιδέα για το τι μπορεί να κάνω λάθος και δεν συγχρονίζονται τα combobox με βάση την τιμή του πεδίου στο Κατάστημα;Ελπίζω να περιέγραψα σωστά το πρόβλημα,ευχαριστώ.
  •  09-11-2007, 10:47 37140 σε απάντηση της 37086

    Απ: Συγχρονισμός δεδομένων σε φόρμα (bindingsources and comboboxes)

    Αν κατάλαβα καλά αυτό το πρόβλημα το έχω αντιμετωπίσει και γω πολλές φορές όταν προσπαθώ να κάνω αλληλοεξαρτομένα binding comboboxes και θεωρώ ότι είναι μια μεγάλη βλακεία απο μεριάς Microsoft.
    Δοκίμασε να κάνεις bind το combobox Καταστήματα στο Load event της φόρμας και αφου έχεις γεμίσει τα απαραίτητα DataSets.

    Π.χ

    ShopsCombobox.DataBindings.Add("SelectedValue", shopsbindinsource,"ShopID")

  •  09-11-2007, 15:42 37155 σε απάντηση της 37140

    Απ: Συγχρονισμός δεδομένων σε φόρμα (bindingsources and comboboxes)

    ¨Ετσι και αλλίως αυτό κάνω έχω ήδη φορτώσει το δεδομένα στο DATASET και το bind το κάνω στο Load event.Άρα δεν είναι αυτό.
  •  10-11-2007, 17:37 37187 σε απάντηση της 37086

    Απ: Συγχρονισμός δεδομένων σε φόρμα (bindingsources and comboboxes)

    Για να πετύχεις αυτό που θες, χρειάζεται να έχεις ορίσει DataRelation objects μεταξύ των DataTables στο DataSet. Κατόπιν, στην φόρμα κάνεις bind το πρώτο combobox πάνω στο πρώτο DataTable και τα υπόλοιπα πάνω στα DataRelations.


    Vir prudens non contra ventum mingit
  •  11-11-2007, 13:13 37207 σε απάντηση της 37187

    Απ: Συγχρονισμός δεδομένων σε φόρμα (bindingsources and comboboxes)

    Τα απαραίτητα DataRelations τα έχω ορίσει ήδη μεταξύ των πινάκων στο Dataset. Μπορείτε να μου δείξετε ένα παράδειιγμα πως κάνω bind του Combobox σε DataRelations;
  •  11-11-2007, 13:59 37211 σε απάντηση της 37207

    Απ: Συγχρονισμός δεδομένων σε φόρμα (bindingsources and comboboxes)

    Παρακάτω είναι ο κώδικας στο Load Event της φόρμας. Με τον παρακάτω κώδικα τα δεδομένα φιλτράρονται κλιμακωτά από πάνω πρός τα κάτω δηλ. Νομό -> Δήμο -> Οικισμό με βάση τις σχέσεις τους. Το πρόβλημα είναι ότι δεν συγχρονίζονται με βάση το OIKISMOSID του Καταστήματος. Δηλαδή να δείχνει τον Οικισμό ύστερα τον parent Δήμο και ύστερα τον Parent Νομό στα αντίστοιχα ComboBoxes. Ποίο είναι το λάθος;Μήπως δεν υπάρχει σαν δυνατότητα αυτό που ζητάω και απαιτείται περισσότερος κώδικας;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35

            '*************BINDINGSOURCES****************************************

    KatasthmataBindingSource .DataSource = dataset
    KatasthmataBindingSource .DataMember = "TBL_KATASTHMATA"


    m_NomoiBindingSource.DataSource = dataset
    m_NomoiBindingSource.DataMember = "tbl_NOMOI"


    m_DhmoiSource .DataSource = m_NomoiBindingSource
    m_DhmoiSource .DataMember = "REL_NOMOI_DHMOI"


    m_OikismoiSource.DataSource = m_DhmoiSource
    m_OikismoiSource.DataMember = "REL_DHMOI_OIKISMOI"


    '*************COMBOBOXES****************************************

    'Combobox για Νομό
    cboNomos.DisplayMember = "NOMOSNAME"
    cboNomos.ValueMember = "NOMOSID"
    cboNomos.DataSource = m_NomoiBindingSource

    'Combobox για Δήμο
    cboDhmos.DisplayMember = "DHMOSNAME"
    cboDhmos.ValueMember = "DHMOSID"
    cboDhmos.DataSource = m_DhmoiSource

    'Combobox για Οικισμό
    cboOikismos.DisplayMember = "OIKISMOSNAME"
    cboOikismos.ValueMember = "OIKISMOSID"
    cboOikismos.DataSource = m_OikismoiSource
    cboOikismos.DataBindings.Add(New Binding("SelectedValue", KatasthmataBindingSource , "OIKISMOSID"))



  •  12-11-2007, 15:37 37247 σε απάντηση της 37211

    Απ: Συγχρονισμός δεδομένων σε φόρμα (bindingsources and comboboxes)

    Αυτό που ζητάς μέσα από το IDE του VS δεν γίνεται. Θα πρέπει να γράψεις κώδικα για να το πετύχεις. Ο κώδικας αυτός δεν είναι κάτι το πολύπλοκο και τρομερό απλά το ανάποδο με τις σχέσεις δεν δουλεύει. Ίσως στο μέλλον να κάνουν κάτι για αυτό.

    Για workaround του προβλήματός σου θα πρέπει να κοιτάς το CurrentChanged event του κάθε BindingSource και ανάλογα με την τιμή να προσδιορίζει το SelectedValue του επάνω στην ιεραρχεία ComboBox. Φυσικά για να το κάνεις αυτό θα πρέπει να μην υπάρχουν Bind τα Relations στα BindingSources. Αυτό ουσιαστικά σημαίνει ότι θα χάσεις το αρχικό πλεονέκτημα να επιλέγεις Νομό και αυτόματα να εμφανίζονται στο άλλο ComboBox οι Δήμοι αλλά μπορείς με απλό κώδικα να το φτιάξεις και αυτό βάζοντας φίλτρο στις δυνατές τιμές που θα μπορεί να σου εμφανίσει ένα ComboBox.

    Είναι σπαστικό να έχουν κάνει τόσο μεγάλα βήματα στον μηχανισμό του Binding και να μην έχουν προσέξει κάποια απλά πράγματα και αυτό είναι που χτυπάει άσχημα. 

     

  •  12-11-2007, 16:00 37250 σε απάντηση της 37086

    Απ: Συγχρονισμός δεδομένων σε φόρμα (bindingsources and comboboxes)

    Κρίμα να λείπουν τέτοιες δυνατότητες. Αυτήν την μανούρα με τα SelectedValues και τα φιλτρα προσπαθούσα να αποφύγω και σκέφτηκα να χρησιμοποιήσω τις σχέσεις που όπως φαίνεται δεν δουλεύουν όπως το φανταζόμουν.Τέλος πάντων παιδιά ευχαριστώ για τις απαντήσεις και την βοήθεια.Ελπίζω στο μέλλον να έχουμε περισσότερη ευλιξία στα χέρια μας.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems