2009-03-05 14 views
0

Ich versuche, Databind zu meiner benutzerdefinierten Wörterbuch-Klasse. In formLoad kann ich an Car.Desc binden, aber ich kann nicht an RatesCache.Desc binden. Sie sind beide öffentliche Zeichenfolgeneigenschaften.C# DataBinding zu String-Eigenschaft auf einem generischen

Was fehlt mir?

Danke!

System.ArgumentException wurde nicht behandelt Message = "nicht auf die Eigenschaft oder Spalte Desc auf der Datasource binden kann \ r \ nParameter Name:. Datamember" Source = "System.Windows.Forms" ParamName = "datamember"

public class RatesCache : Dictionary<int, Rate> 
    { 
     public string Desc { get; set; } 
    } 

    public class Car 
    { 
     public string Desc { get; set; } 
    } 

    static Car car = new Car(); 

    static RatesCache rc = new RatesCache(); 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     rc.Desc = "hello too"; 
     car.Desc = "Im a car"; 
     textBox1.DataBindings.Add("Text", rc, "Desc"); 
    } 

Antwort

1

Meine Vermutung ist, dass, weil Ihre Klasse von einem Dictionary erbt, das eine Sammlung ist, es die DataBinding für das Textfeld verwirft. In Windows Forms gibt es eine eigene Methode für die Datenbindung an eine Sammlung, die sich von der direkten Bindung an eine Eigenschaft einer Klasse unterscheidet. Nicht viel von einer Antwort, ich weiß, aber ich glaube nicht, dass es wirklich einen Weg gibt. Mein Vorschlag wäre, das Dictionary nicht direkt zu erben; Verwahren Sie lieber ein internes Dictionary und legen Sie Methoden nach Bedarf offen. Oder, databind nicht die texbox direkt. Richten Sie stattdessen ein Ereignis immer dann ein, wenn sich Ihre "Desc" -Eigenschaft in Ihrer RatesCache-Klasse ändert, und hören Sie dann in Ihrem Formular dieses Ereignis an. Wenn es sich ändert, aktualisieren Sie Ihre Textbox.

2
private void Form1_Load(object sender, EventArgs e) 
{ 
    rc.Desc = "hello too"; 
    car.Desc = "Im a car"; 
    textBox1.DataBindings.Add("Text", rc, "Desc"); 
    textBox1.TextChanged .TextChanged += _textBox1_TextChanged; 
} 

private void _messagesReceviedLabel_TextChanged(object sender, EventArgs e) 
{ 
    _textBox1.Text = rc.Desc.ToString(); 
} 

public class RatesCache : Dictionary<int, Rate> 
{ 
    public string Desc { get; set; } 

    public override string ToString() 
    { 
     return Desc; 
    } 
} 
Verwandte Themen