c # DataBinding à la propriété string sur un générique
-
03-07-2019 - |
Question
J'essaie d'établir une liaison de données avec ma classe de dictionnaire personnalisée. Dans formLoad, je peux me lier à Car.Desc mais je ne peux pas me lier à RatesCache.Desc. Ce sont deux propriétés de chaîne publiques.
Qu'est-ce qui me manque?
Merci!
L'exception System.ArgumentException n'a pas été gérée. Message = " Impossible de se connecter à la propriété ou à la colonne de la source de données. \ R \ nNom du paramètre: 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");
}
La solution
Je suppose que, comme votre classe hérite d'un dictionnaire qui est une collection, elle supprime la liaison de données pour la zone de texte. Windows Forms a sa propre façon de traiter la liaison de données avec une collection différente de la liaison directe à une propriété d'une classe. Je ne sais pas trop quoi répondre, mais je ne pense pas qu'il y ait vraiment un moyen de le contourner. Ma suggestion serait de ne pas directement hériter de Dictionary; conservez plutôt un dictionnaire interne et exposez les méthodes nécessaires. OU, ne faites pas directement une recherche dans la texbox. Relevez plutôt un événement chaque fois que votre " Desc " quot " changements de propriété dans votre classe RatesCache, puis dans votre formulaire, écoutez cet événement. Lorsque cela change, mettez à jour votre zone de texte.
Autres conseils
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;
}
}