Подтвердить что ты не робот

Подтверждение пользовательского интерфейса Entity Framework с использованием WinForms

Я заинтересован в настройке проверки на стороне клиента с помощью приложения WinForms и Entity Framework 5. Я понимаю, что есть интерфейс IValidatableObject, который я могу реализовать для выполнения и выборочной проверки, которые могут мне понадобиться для каждого объекта.

Однако, поскольку я использую WinForms, я хотел бы использовать ErrorProvider для представления пользователю с хорошим уведомлением, когда есть ошибка проверки, когда они заполняют форму. Возможно ли реализовать эту функциональность с помощью интерфейса IValidatableObject или мне нужно будет реализовать интерфейс IDataErrorInfo для моих объектов, чтобы обеспечить корректную работу ErrorProvider?

Если у вас есть другие предложения по лучшей альтернативе этому, пожалуйста, дайте мне знать, и я тоже с удовольствием рассмотрю это.

4b9b3361

Ответ 1

Допустим, у вас есть Entity под названием Car, и этот класс содержит свойство, которое должно быть проверено.

public class Car
{
  [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int Id { get; set; }

  // Accepted values have to be between 1 and 5.
  public int NeedToBeValidatedRange { get; set; }
}

Вы должны создать базовый класс для всех своих entites в моем примере, я позвоню Entity.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;

/// This is the base class for all entities and it provide a change notfication.
public abstract class Entity : INotifyPropertyChanged
{
  // Event fired when the property is changed!
  public event PropertyChangedEventHandler PropertyChanged;


  /// Called when int property in the inherited class is changed for ther others properties like (double, long, or other entities etc,) You have to do it.
  protected void HandlePropertyChange(ref int value, int newValue, string propertyName)
  {
    if (value != newValue)
    {
      value = newValue;
      this.Validate(propertyName);
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
  }

  /// Validate the property 
  /// <returns>
  /// The list of validation errors
  /// </returns>
  private ICollection<ValidationResult> PropertyValidator(string propertyName)
  {
    var validationResults = new Collection<ValidationResult>();
    PropertyDescriptor property = TypeDescriptor.GetProperties(this)[propertyName];

    Validator.TryValidateProperty(
      property.GetValue(this),
      new ValidationContext(this, null, null) { MemberName = propertyName },
      validationResults);

    return validationResults;
  }

  /// Validates the given property and return all found validation errors.
  private void Validate(string propName)
  {
    var validationResults = this.PropertyValidator(propName);
    if (validationResults.Count > 0)
    {
      var validationExceptions = validationResults.Select(validationResult => new ValidationException(validationResult.ErrorMessage));
      var aggregateException = new AggregateException(validationExceptions);
      throw aggregateException;
    }
  }
}

Теперь вы должны поменять класс Car, и это должно быть так:

public class Car : Entity
{
  private int id;
  private int needToBeValidatedRange;

  [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int Id
  {
    get
    {
      return this.id;
    }
    set
    {
      this.HandlePropertyChange(ref this.id, value, "Id");
    }
  }

  [Range(1, 5)]
  public int NeedToBeValidatedRange
  {
    get
    {
      return this.needToBeValidatedRange;
    }
    set
    {
      this.HandlePropertyChange(ref this.needToBeValidatedRange, value, "NeedToBeValidatedRange ");
    }
  }
}

Где-то в пользовательском интерфейсе вы создаете объекты автомобиля:

Car car1 = new Car();
car1.NeedToBeValidatedRange = 3;  // This will work!

Car car2 = new Car();
car2.NeedToBeValidatedRange = 6;  // This will throw ValidationException
  • WPF поддерживает очень хорошее исключение ValidationException.
  • Winforms частично поддерживает ValidationException, но теперь вы можете свободно обращаться с этим.

Ответ 2

Существует два варианта:

  • расширьте классы poco с помощью IValidateObject и IdataErrorInfo и поднимите ошибку ui в методе проверки.
  • поймать ошибку проверки при вызове сохранения изменений и вызвать ErrorProvider непосредственно в зависимости от того, какое поле объекта генерирует ошибку проверки.

Ниже приведены примеры расширения классов poco с помощью IValidateObject и обработки ошибок проверки при вызове изменений.

http://msdn.microsoft.com/en-us/data/gg193959.aspx

Ответ 3

Возможно, вы захотите попробовать то, что я предложил здесь. Это может быть применимо только в том случае, если вы сначала используете код. Вы можете просто прикрепить его к запуску на каком-то событии ввода пользователя.

fooobar.com/info/289981/...