Εχω ψιλουποψιαστεί γιατί συμβαίνει, αλλά θα ήθελα να ακούσω και καμμια άλλη γνώμη.
Το σενάριο είναι οτι δεν μπορώ να κάνω bind (απλό) ενός property ενός δικού μου object που κληρονομεί από List (of T) σε ένα Textbox. Το αναλύω παρακάτω:
Εχω ένα απλό textbox σε μια φόρμα, ας πούμε το TextBox1.
Εχω επίσης ένα δικό μου object, ας πούμε το myThing. Στην πιό απλουστευμένη του μορφή ορίζεται κάπως έτσι:
Public Class ΜyThing
Inherits List(Of Something)
Private _myProperty As String
Public Property MyProperty() As String
Get
Return _myProperty
End Get
Set(ByVal value As String)
_myProperty = value
End Set
End Property
End Class
Θέλω μετά να κάνω bind το MyProperty στο Textbox1. (Ας υποθέσουμε οτι το MyProperty υπολογίζει σύνολα από κάποια αριθμητικά properties των αντικειμένων of type Something που βρίσκονται αποθηκευμένα στο myThing - κάτι τέτοιο κάνει και στην πραγματική υλοποίηση). Κάνω λοιπόν:
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'Ετσι απλά φτιάχνω κάτι για να ειναι πιό ολοκληρωμένο
Dim thingy As New MyThing
Dim o1 As New Something
Dim o2 As New Something
thingy.Add(o1)
thingy.Add(o2)
'Προσπαθώ να κάνω το databinding
Me.TextBox1.DataBindings.Add("Text", thingy, "MyProperty")
End Sub
Και τρώω το εξής:
System.ArgumentException
{"Cannot bind to the property or column MyProperty on the DataSource.
Parameter name: dataMember"}
Φυσικά, κοιτώντας το StackTrace αποκτώ την υποψία οτι περιμένει να κάνει bind σε λίστα και δεν μπορεί μια και το control δεν υποστηρίζει λίστες:
at System.Windows.Forms.BindToObject.CheckBinding()
at System.Windows.Forms.BindToObject.SetBindingManagerBase(BindingManagerBase lManager)
at System.Windows.Forms.Binding.SetListManager(BindingManagerBase bindingManagerBase)
at System.Windows.Forms.ListManagerBindingsCollection.AddCore(Binding dataBinding)
at System.Windows.Forms.BindingsCollection.Add(Binding binding)
at System.Windows.Forms.BindingContext.UpdateBinding(BindingContext newBindingContext, Binding binding)
at System.Windows.Forms.Binding.SetBindableComponent(IBindableComponent value)
at System.Windows.Forms.ControlBindingsCollection.AddCore(Binding dataBinding)
at System.Windows.Forms.ControlBindingsCollection.Add(String propertyName, Object dataSource, String dataMember, Boolean formattingEnabled, DataSourceUpdateMode updateMode, Object nullValue, String formatString, IFormatProvider formatInfo)
at System.Windows.Forms.ControlBindingsCollection.Add(String propertyName, Object dataSource, String dataMember)
(τα παρακάτω διαγράφονται για να μην γεμιζουμε με άχρηστη πληροφορία)
Τόσο πολύ τον μπερδεύει το γεγονός οτι πρόκειται για List (of T), ακόμα και αν εγώ θέλω να κάνω bind σε ένα απλό property;
Το έχει διαπιστώσει κάποιος άλλος; Υπάρχει κάποιο workaround;
Σωτήρης Φιλιππίδης
DotSee Web Services