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

Était-ce utile?

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();
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top