δεδομένα WinForms σύνθετο πλαίσιο δέσμευσης gotcha

ψήφοι
44

Ας υποθέσουμε ότι κάνετε κάτι σαν το παρακάτω

List<string> myitems = new List<string>
{
    Item 1,
    Item 2,
    Item 3
};

ComboBox box = new ComboBox();
box.DataSource = myitems;

ComboBox box2 = new ComboBox();
box2.DataSource = myitems

Έτσι τώρα έχουμε 2 σύνθετα πλαίσια συνδέονται σε αυτό το φάσμα, και όλα λειτουργούν σωστά. Αλλά όταν αλλάζετε την αξία ενός σύνθετου πλαισίου, είναι αλλαγές τόσο σύνθετα πλαίσια με εκείνο που μόλις επιλέξατε.

Τώρα, ξέρω ότι πίνακες είναι πάντα περνούν με αναφορά (έμαθε ότι όταν έμαθα C: D), αλλά γιατί στη γη θα αλλάξει καθώς τα σύνθετα πλαίσια; Δεν πιστεύω ότι το σύνθετο πλαίσιο ελέγχου τροποποιεί τη συλλογή καθόλου.

Ως εργασία γύρω, δεν αυτό θα επιτευχθεί η funcionality που αναμένεται / επιθυμητή

ComboBox box = new ComboBox();
box.DataSource = myitems.ToArray();
Δημοσιεύθηκε 02/08/2008 στις 17:09
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
37

Αυτό έχει να κάνει με το πώς οι συνδέσεις δεδομένων που έχει συσταθεί στο πλαίσιο dotnet, ειδικά το BindingContext. Σε υψηλό επίπεδο, αυτό σημαίνει ότι, αν δεν έχετε ορίζεται διαφορετικά σε κάθε μορφή και όλοι οι έλεγχοι του μετοχικού μορφή η ίδια BindingContext. Όταν ρυθμίζετε την DataSourceιδιοκτησία του ComboBoxθα χρησιμοποιήσει το BindingContextνα πάρει ένα ConcurrenyMangagerπου τυλίγει τη λίστα. Η ConcurrenyManagerπαρακολουθεί τέτοια πράγματα όπως η τρέχουσα επιλεγμένη θέση στη λίστα.

Όταν ρυθμίσετε το DataSourceτου δεύτερου ComboBox, θα χρησιμοποιούν τα ίδια BindingContext(τα έντυπα), η οποία θα δώσει μία αναφορά στην ίδια ConcurrencyManagerόπως ανωτέρω χρησιμοποιείται για να δημιουργήσει τις δέστρες δεδομένων.

Για να πάρετε μια πιο λεπτομερή εξήγηση δείτε BindingContext .

Απαντήθηκε 02/08/2008 στις 18:18
πηγή χρήστη

ψήφοι
20

Μια καλύτερη λύση (ανάλογα με το μέγεθος της πηγής δεδομένων) είναι να δηλώσει δύο BindingSourceαντικείμενα (νέα ως 2,00) δεσμεύοντας την συλλογή σε εκείνους και στη συνέχεια συνδέονται εκείνες στις comboboxes.

Εσωκλείω ένα πλήρες παράδειγμα.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private BindingSource source1 = new BindingSource();
        private BindingSource source2 = new BindingSource();

        public Form1()
        {
            InitializeComponent();
            Load += new EventHandler(Form1Load);
        }

        void Form1Load(object sender, EventArgs e)
        {
            List<string> myitems = new List<string>
            {
                "Item 1",
                "Item 2",
                "Item 3"
            };

            ComboBox box = new ComboBox();
            box.Bounds = new Rectangle(10, 10, 100, 50);
            source1.DataSource = myitems;
            box.DataSource = source1;

            ComboBox box2 = new ComboBox();
            box2.Bounds = new Rectangle(10, 80, 100, 50);
            source2.DataSource = myitems;
            box2.DataSource = source2;

            Controls.Add(box);
            Controls.Add(box2);
        }
    }
}

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

Απαντήθηκε 21/08/2008 στις 15:48
πηγή χρήστη

ψήφοι
2

Αυτό θα μπορούσε να είναι απλώς ένα τυπογραφικό λάθος, αλλά στον κώδικα που δώσατε εσείς αναφορά μόνο το πρώτο σύνθετο πλαίσιο για τον καθορισμό του πηγή δεδομένων:

ComboBox box = new ComboBox();
box.DataSource = myitems;

ComboBox box2 = new ComboBox();
**box**.DataSource = myitems

Η πηγή δεδομένων για box2να μην έχει ρυθμιστεί.

Απαντήθηκε 21/08/2008 στις 18:12
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more