Domanda

Sto provando a Databind per la mia classe di dizionario personalizzata. In formLoad, posso associare Car.Desc ma non posso associare a RatesCache.Desc. Sono entrambe proprietà di stringa pubbliche.

Cosa mi sto perdendo?

Grazie!

System.ArgumentException non è stata gestita   Messaggio = " Impossibile eseguire il binding alla proprietà o alla colonna Desc sull'origine dati. \ 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");
    }
È stato utile?

Soluzione

La mia ipotesi è che, poiché la tua classe sta ereditando da un dizionario che è una raccolta, getta DataBinding per la casella di testo. Windows Forms ha il suo modo di gestire la creazione di database in una raccolta diversa rispetto a quando si associa direttamente a una proprietà di una classe. Non ho una gran risposta, lo so, ma non credo che ci sia davvero un modo per aggirarlo. Il mio suggerimento sarebbe di non ereditare direttamente dal dizionario; piuttosto mantenere un dizionario interno ed esporre i metodi secondo necessità. O, non collegare direttamente il texbox. Piuttosto, organizza un evento ogni volta che il tuo " Desc " le proprietà cambiano nella tua classe RatesCache e quindi nel tuo modulo ascoltano quell'evento. Quando cambia, aggiorna la casella di testo.

Altri suggerimenti

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;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top