Liaison de données et lancer exception setter
-
22-08-2019 - |
Question
Disons que j'ai une classe simple
public class Person
{
public string Name { get; set; }
private int _age;
public int Age
{
get { return _age; }
set
{
if(value < 0 || value > 150)
throw new ValidationException("Person age is incorrect");
_age = value;
}
}
}
Je veux installer une liaison pour cette classe:
txtAge.DataBindings.Add("Text", dataSource, "Name");
Maintenant, si j'entre valeur d'âge incorrect dans la zone de texte (disons 200) l'exception dans le setter sera avalé et je ne pourrai rien faire du tout jusqu'à ce que je corrige la valeur dans la zone de texte. Je veux dire la zone de texte ne sera pas en mesure de se concentrer perdre. Il est tout silencieux - aucune erreur -. Vous ne pouvez pas faire quoi que ce soit (même fermer la forme ou l'application entière) jusqu'à ce que vous corriger la valeur
Il semble comme un bug, mais la question est: quelle est une solution de contournement pour cette
La solution
Ok, voici la solution:
Nous devons gérer l'événement BindingComplete de BinsingSource, CurrencyManager ou classe BindingBanagerBase. Le code peut ressembler à ceci:
/* Note the 4th parameter, if it is not set, the event will not be fired.
It seems like an unexpected behavior, as this parameter is called
formattingEnabled and based on its name it shouldn't affect BindingComplete
event, but it does. */
txtAge.DataBindings.Add("Text", dataSource, "Name", true)
.BindingManagerBase.BindingComplete += BindingManagerBase_BindingComplete;
...
void BindingManagerBase_BindingComplete(
object sender, BindingCompleteEventArgs e)
{
if (e.Exception != null)
{
// this will show message to user, so it won't be silent anymore
MessageBox.Show(e.Exception.Message);
// this will return value in the bound control to a previous correct value
e.Binding.ReadValue();
}
}