20
mars
2007
Très surpris par le DataBinding
mars
2007
J’ai eu une surprise avec le DataBinding tout à l’heure.
Imaginons le code suivant :
public class Class1
{
private Class2 _c2;
public Class2 C2
{
get { return _c2; }
set { _c2 = value; }
}
}
public class Class2
{
private string _text;
public Class2(string text)
{
_text = text;
}
public string Text
{
get { return _text; }
set { _text = value; }
}
public override string ToString()
{
return _text;
}
}
public class ListClass1 : List<Class2>
{
private static ListClass1 _instance;
public static ListClass1 Instance
{
get
{
if (_instance == null)
{
_instance = new ListClass1();
_instance.Add(new Class2("un"));
_instance.Add(new Class2("deux"));
_instance.Add(new Class2("trois"));
}
return _instance;
}
}
}
{
private Class2 _c2;
public Class2 C2
{
get { return _c2; }
set { _c2 = value; }
}
}
public class Class2
{
private string _text;
public Class2(string text)
{
_text = text;
}
public string Text
{
get { return _text; }
set { _text = value; }
}
public override string ToString()
{
return _text;
}
}
public class ListClass1 : List<Class2>
{
private static ListClass1 _instance;
public static ListClass1 Instance
{
get
{
if (_instance == null)
{
_instance = new ListClass1();
_instance.Add(new Class2("un"));
_instance.Add(new Class2("deux"));
_instance.Add(new Class2("trois"));
}
return _instance;
}
}
}
Ensuite, j’avais bindé une combo de la manière suivante :
comboBox1.DataSource = ListClass1.Instance;
comboBox1.DataBindings.Add("SelectedItem", c1, "C2");
comboBox1.DataBindings.Add("SelectedItem", c1, "C2");
Quand j’effaçais la valeur de la combo, impossible d’en sortir (symptomatique d’un DataBinding qui génère une exception).
J’ai donc essayé de me brancher sur l’évènement Format du binding pour regarder ce qu’il se passait :
Binding binding = new Binding("SelectedItem", c1, "C2");
binding.Parse += new ConvertEventHandler(binding_Parse);
comboBox1.DataBindings.Add(binding);
binding.Parse += new ConvertEventHandler(binding_Parse);
comboBox1.DataBindings.Add(binding);
J’ai ainsi pu constater que dans ma méthode
private void binding_Parse(object sender, ConvertEventArgs e)
{
}
{
}
e.Value était égale à DBNull.Value.
En fait, le problème vient du binding.DataSourceNullValue.
Afin d’y remédier, il faut renseigner un peu plus de paramètres à notre binding :
comboBox1.DataBindings.Add("SelectedItem", c1, "C2", true, DataSourceUpdateMode.OnValidation, null);