2009-11-19 2 views
2

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

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

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

ответ

3

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

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

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

ОБНОВЛЕНИЕ

Здесь, как это выглядело. Inform Заявляю список элементов управления, которые должны быть проверены:

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

Интересный подход - как именно вы реализовали эти методы проверки в оболочках? У меня есть эта проблема с сторонним элементом управления (Resco DetailView), и мне интересно, можно ли применить такую ​​же технику. Вы наследовали эти элементы управления? Вам удалось сохранить поддержку дизайна? –

+0

Спасибо за код - не видели DataBindings [string] .WriteValue раньше.В соответствии с моим ответом мне не нужно было следовать вашему подходу, но если мне когда-либо понадобится принудительно привязать данные, ваш ответ будет очень полезен. –

0

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

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

Немного взломать, но это будет сделано пока.

+0

Обновлен мой ответ с образцом кода. Как я уже говорил, я попытался использовать фокусное событие для проверки формы. Однако мне не повезло. Тот факт, что нет простого способа проверить форму в компактной структуре, довольно странно. – empi

0

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

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

Смежные вопросы