Pregunta

Vamos a decir que tengo una clase 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;
    }
  }
}

A continuación, Quiero fijar un enlace para esta clase:

txtAge.DataBindings.Add("Text", dataSource, "Name");

Ahora si entro valor de edad incorrecta en el cuadro de texto (por ejemplo 200) excepto en la incubadora será absorbida y no voy a ser capaz de hacer nada en absoluto hasta que corregir el valor en el cuadro de texto. Me refiero a la caja de texto no será capaz de perder el foco. Todo es silencio - no hay errores -. Que no se puede hacer nada (ni siquiera cerrar el formulario o toda la aplicación) hasta que corrija el valor

Parece como un insecto, pero la pregunta es: ¿qué es una solución para este

¿Fue útil?

Solución

Ok, aquí está la solución:

Tenemos que manejar BindingComplete caso de BinsingSource, CurrencyManager o una clase de BindingBanagerBase. El código puede tener este aspecto:

/* 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();
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top