2008-10-21 3 views
8

Das ist die Ausnahme, die ich erhalte, wenn ich versuche, an einen System.Type.Name zu binden.Kann nicht an den Eigenschaften- oder Spaltennamen der DataSource gebunden werden. Parametername: dataMember

Hier ist, was ich tue:

this.propertyTypeBindingSource.DataSource = typeof(System.Type); 

/* snip */ 

this.nameTextBox1.DataBindings.Add(
    new System.Windows.Forms.Binding(
     "Text", 
     this.propertyTypeBindingSource, 
     "Name", true)); 

Gibt es einen Trick mit zu System.Type Bindung, ist es nicht erlaubt oder gibt es eine Abhilfe? Habe keine Probleme mit anderen Typen zu binden.

+0

Möglicherweise verwandt mit [Datenbindung an die Eigenschaften eines Objekts, das IEnumerable implementiert] (http://stackoverflow.com/q/1336395/167897) – Wernight

Antwort

3

Eine Problemumgehung gefunden. Hergestellt eine Klasse

public class StubPropertyType 
{ 
    public StubPropertyType(Type type) 
    { 
     this.StubPropertyTypeName = type.Name; 
    } 

    public string StubPropertyTypeName = string.Empty; 
} 

erstellt eine verbindliche Quelle

this.propertyStubBindingSource.DataSource = typeof(StubPropertyType); 

eine Instanz der Klasse erstellt und verpflichtet, die Textbox zu.

this.nameTextBox.DataBindings.Add(
    new System.Windows.Forms.Binding(
     "Text", 
     this.propertyStubBindingSource, 
     "StubPropertyTypeName", 
     true)); 

funktioniert genau wie erforderlich.

11

In der Tat gibt es spezielle Behandlung von Typ ... dieser Ansatz wird in der IDE usw. verwendet, um Meta-Daten im Voraus zu konfigurieren. Wenn Sie bei IDE-generierten Bindungen suchen, tun sie Dinge wie:

bindingSource1.DataSource = typeof(MyObject); 

sagen „wenn wir reale Daten zu erhalten, erwarten wir MyObject isntance (n)“; Wenn Sie nach "Name" fragen, sucht es nach der Namenseigenschaft auf MyObject - nicht dem Namen der Typinstanz. Dadurch können Grids usw. ihre Metadaten erhalten, ohne auf die echten Daten warten zu müssen. Sie können jedoch nicht an Type "for real" binden.

Der System.ComponentModel-Code ist identisch zwischen einfachen Bindungen und Listenbindungen (geben oder nehmen Sie einen Währungsmanager), daher erben einfache Bindungen auch dieses Verhalten. Ebenso können Sie nicht an Eigenschaften einer Klasse binden, die IList/IListSource implementiert, da dies auf eine spezielle Weise interpretiert wird.

Ihre zusätzliche Klasse scheint ein vernünftiger Ansatz zu sein.

0

Einer der möglichen Gründe für diesen Fehler ist Tabelle/Dataset haben keine Spalte angegeben. Speziell, im Falle von typisierten DataSet sicherstellen, dass Sie richtige Namen in XSD mit Spaltennamen aus Tabelle