Как я могу принудительно проверить форму / элемент управления в Compact Framework? - PullRequest
3 голосов
/ 19 ноября 2009

Есть ли способ принудительной проверки управления в .NET CF? В полном .NET есть метод Validate (), но он отсутствует в CF.

Я пытаюсь заставить элемент управления привязывать данные обратно к модели при закрытии формы, но нажатие кнопки главного меню, похоже, не отвлекает внимание от элемента управления, и события Validating и Validated не запускаются.

Знаете ли вы какие-либо обходные пути для этой проблемы?

Ответы [ 3 ]

3 голосов
/ 19 ноября 2009

Я боролся с той же проблемой около года назад. Все, что я нашел в Интернете, было довольно неприятно (то есть перебирал элементы управления и ловил каждый фокус элемента управления, таким образом вызывая событие проверки или какое-то решение, которое в значительной степени зависело от пинвока или отражения - я точно не помню).

Я закончил тем, что создал упаковщики, которые включали метод Validate для моих текстовых полей и т. Д., И сохранил коллекцию этих оболочек. Таким образом, я мог бы перебирать свои обертки и вызывать validate для каждого элемента управления.

Это решение работало нормально. Сначала я попробовал решение с программной фиксацией каждого фокуса управления, но у меня было много проблем с ним. Потратив некоторое время на попытки улучшить это решение, я решил создать эти обертки, и это было очень хорошее решение.

UPDATE

Вот как это выглядело. Информировать Я объявляю список элементов управления, которые должны быть проверены:

private List<TextBoxWithValidation> textBoxesWithValidation;

В конструкторе я добавляю элементы управления в список:

TextBoxWithValidation emailTextBoxWithValidation = new TextBoxWithValidation(emailTextBox);
emailTextBoxWithValidation.AddValidationPair(Validator.ValidationType.VALIDATE_NOT_EMPTY, "ValidateNotEmptyEmail");
emailTextBoxWithValidation.AddValidationPair(Validator.ValidationType.VALIDATE_EMAIL, "ValidateEmailEmail");
textBoxesWithValidation.Add(emailTextBoxWithValidation);

Тогда я могу проверить форму:

private bool ValidateForm()
{
  foreach (TextBoxWithValidation textBoxWithValidation in textBoxesWithValidation)
  {
    if (!textBoxWithValidation.Validate())
    {
      return false;
    }
  }
  return true;
}

И текстовое поле с проверкой выглядит так:

class TextBoxWithValidation
{
  class ValidationTypeMessagePair
  {
    public Validator.ValidationType ValidationType { get; set; }
    public string ValidationMessage { get; set; }

    public ValidationTypeMessagePair(Validator.ValidationType validationType, string validationMessage)
    {
      this.ValidationType = validationType;
      this.ValidationMessage = validationMessage;
    }
  }

  private List<ValidationTypeMessagePair> validationPairs;
  private TextBox textBox;

  public TextBoxWithValidation(TextBox textBox)
  {
    this.textBox = textBox;
    this.textBox.DataBindings["Text"].DataSourceUpdateMode = DataSourceUpdateMode.Never;            
    validationPairs = new List<ValidationTypeMessagePair>();
  }

  public void AddValidationPair(Validator.ValidationType validationType, string validationMessage)
  {
    validationPairs.Add(new ValidationTypeMessagePair(validationType, validationMessage));
  }

  public bool Validate()
  {
    foreach (ValidationTypeMessagePair validationPair in validationPairs)
    {
      if (!Validator.Validate(validationPair.ValidationType, textBox, Messages.Localize(validationPair.ValidationMessage))) return false;
    }
    textBox.DataBindings["Text"].WriteValue();
    return true;
  }

  public void ClearValidationStatus()
  {
    textBox.BackColor = System.Drawing.SystemColors.Window;
  }

}
0 голосов
/ 10 декабря 2009

Я думаю, что для запуска событий Validating и Validated посредством фокусировки на другом элементе управления необходимо установить для свойства Form AutoValidate значение AutoValidate.EnableAllowFocusChange.

Надеюсь, это поможет. =]

0 голосов
/ 20 ноября 2009

В случае, если кто-то найдет это полезным, я опишу обходной путь, который я применил.

В обработчике ОК я добавил код, который фокусируется на панели, который содержит элемент управления, который я хочу проверить. Когда элемент управления для редактирования данных теряет фокус, он запускает события Validating и Validated и связывает данные с классом модели. Таким образом, форма (которая, между прочим, является общей для многих частей «мастера» и знает только о панели, на которую загружены экраны) может принудительно подтвердить контроль.

Немного взломать, но пока подойдет.

...