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

 

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

Ερώτηση για ListBox.DisplayMember

Îåêßíçóå áðü ôï ìÝëïò plasmatek. Τελευταία δημοσίευση από το μέλος KelMan στις 13-02-2008, 00:15. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  12-02-2008, 01:27 40089

    Ερώτηση για ListBox.DisplayMember

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
        class testobj
    {
    private string prop1;

    private string prop2;

    public testobj(string str1, string str2)
    {
    this.prop1=str1;
    this.prop2=str2;
    }


    public string TestProp
    {
    get
    {
    return prop2;
    }
    }
    }
    Έστω ότι έχω την παραπάνω κλάση.

    Αν κάνω το εξής:

    ArrayList temp1 = new ArrayList();
    temp1.Add(new testobj("aa","11"));
    temp1.Add(new testobj("bb","22"));
    temp1.Add(new testobj("cc","33"));

    listBox1.DataSource = temp1;
    listBox1.DisplayMember = "TestProp";

    τότε δουλεύει κανονικά και στο ListBox εμφανίζονται οι τιμές 11, 22 και 33.

    Αν αντί για ArrayList χρησιμοποιήσω Array:

    testobj[] temp1 = new testobj[4];
    temp1[0] = new testobj("aa", "11");
    temp1[1] = new testobj("bb", "22");
    temp1[2] = new testobj("cc", "33");

    listBox1.DataSource = temp1;
    listBox1.DisplayMember = "TestProp";

    τότε οι τιμές που εμφανίζονται στο Listbox είναι το όνομα της κλάσης (ConsoleApp1.testobj). Αν κάνω overload το toString() τότε θα εμφανίστει στο Listbox το αποτέλεσμα του toString() αδιαφορώντας για την τιμή του DisplayMember.

    Τι κάνω λάθος;

    Στην περίπτωση με το Array δοκίμασα να βάλω ένα breakpoint ακριβώς μετά το listBox1.DisplayMember = "TestProp"; και παρατήρησα στον debugger ότι η τιμή του DisplayMember δεν είχε αλλαχτεί (παρέμενε "").

    Φχαριστώ για τον χρόνο σας :-)

  •  12-02-2008, 09:04 40091 σε απάντηση της 40089

    Απ: Ερώτηση για ListBox.DisplayMember

    To ότι έχεις ένα structure όπως το Array που έστω είναι γεμάτο από objects με συγκεκριμένα properties δεν συνεπάγεται ότι είναι bindable. Ουσιαστικά χρειάζεται να βάζεις αυτά τα objects σε ένα collection που να υποστηρίζει data binding. Υπάρχουν έτοιμα τέτοια collections όπως για παράδειγμα το BindingList(T). Επιπρόσθετα, χρειάζεται η κλάση στην οποία βασίζονται τα objects σου να υλοποιεί κάποια interfaces ώστε να μπορεί να καταλάβει το control που πρόκειται να "δεχθεί" τα data τι features υποστηρίζονται (πχ sorting, filtering, value change notifications, κλπ).

    Το θέμα έχει αρκετό ψωμί, μπορείς να ξεκινήσεις από εδώ: Windows Forms Data Binding Μέσα στα υπόλοιπα, δες ιδιαίτερα αυτό: Interfaces Related to Data Binding


    Vir prudens non contra ventum mingit
  •  12-02-2008, 10:21 40092 σε απάντηση της 40091

    Απ: Ερώτηση για ListBox.DisplayMember

    Σίγουρα το Array δεν υλοποιεί/κληρονομεί τα απαιτούμενα interfaces? Κοιτώντας το με τον Reflector παρατηρώ ότι σίγουρα υλοποιεί το IList. Επίσης έχω την εντύπωση ότι το documentation για τα datasets όποτε αναφέρεται σε ArrayList  αναφέρεται και σε Array (υπονοώντας ότι συμπεριφέρονται παρόμοια). πχ στο

    http://msdn2.microsoft.com/en-us/library/system.windows.forms.listcontrol.datasource.aspx

    λέει

    Property Value

    Type: System..::.Object

    An object that implements the IList or IListSource interfaces, such as a DataSet or an Array. The default is nullNothingnullptra null reference (Nothing in Visual Basic).

    εκτός κι αν υπονοεί ότι ναι μεν μπορώ να έχω ένα Array ως Dataset στο ListBox χωρίς αυτό να σημαίνει ότι Array και ArrayList έχουν την ίδια συμπεριφορά όσον αφορά στο DisplayMember.

  •  12-02-2008, 11:10 40095 σε απάντηση της 40092

    Απ: Ερώτηση για ListBox.DisplayMember

    Χε χε, καλά τα λες αλλά υπάρχει το catch!

    Κοίτα τι λέει στο MSDN:

    Important Note:

    In the .NET Framework version 2.0, the Array class implements the System.Collections.Generic..::.IList<(Of <(T>)>), System.Collections.Generic..::.ICollection<(Of <(T>)>), and System.Collections.Generic..::.IEnumerable<(Of <(T>)>) generic interfaces. The implementations are provided to arrays at run time, and therefore are not visible to the documentation build tools. As a result, the generic interfaces do not appear in the declaration syntax for the Array class, and there are no reference topics for interface members that are accessible only by casting an array to the generic interface type (explicit interface implementations). The key thing to be aware of when you cast an array to one of these interfaces is that members which add, insert, or remove elements throw NotSupportedException.

    Εν ολίγοις, το array δεν είναι collection ενώ το ArrayList (που εσωτερικά δουλεύει πάνω σε ένα array) είναι και γι αυτό βλέπεις αυτή τη διαφορετική συμπεριφορά


    Vir prudens non contra ventum mingit
  •  12-02-2008, 20:34 40100 σε απάντηση της 40095

    Απ: Ερώτηση για ListBox.DisplayMember

    Θα συμφωνήσω με όλα τα παραπάνω περί Interfaces και implementations αλλά το συγκεκριμένο πρόβλημα βρίσκεται στο μέγεθος του array και όχι σε αυτά που κάνει implement. Μείωσε το μέγεθος από 4 σε 3 (που είναι και ο αριθμός των αντικειμένων που εισάγεις) και όλα θα παίξουν.

  •  13-02-2008, 00:15 40101 σε απάντηση της 40100

    Απ: Ερώτηση για ListBox.DisplayMember

    Πολύ σωστά το παρατήρησες infoCenter. Όταν το Array έχει τουλάχιστον ένα member που είναι Null, τότε το data binding πάει περίπατο. Ακριβώς αυτό συνιστά την προβληματική συμπεριφορά που έχει στο data binding. Πολύ απλά, το Array δεν προσφέρεται γι αυτή τη δουλειά. Το data binding είναι ένας μηχανισμός που αναλαμβάνει να μας βοηθήσει κάνοντας πράγματα "automagically" για μας. Για να το πετύχει όμως αυτό, χρειάζεται αφενός το collection να εμπεριέχει meta-data + meta-behavior (πράγματα που δεν έχει το Array - ενώ έχει για παράδειγμα το BindingList(Of T)) και αφετέρου να δουλέψουμε με το BindingSource object το οποίο γνωρίζει πως να τα χρησιμοποιήσει. Με την εμφάνιση του .ΝΕΤ Framework 2.0, το BindingSource αποτελεί το όχημα πάνω στο οποίο βασίζεται το data binding.


    Vir prudens non contra ventum mingit
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems