Проверка WinForm UI

Вы могли бы сделать ...

substr(x, 15, nchar(x)-4)

или программно

prefix  = "protein_class_"
postfix = ".txt"
substr(x, nchar(prefix)+1, nchar(x)-nchar(postfix))
43
задан Mohit Arora 6 January 2015 в 06:35
поделиться

9 ответов

В моем собственном приложении мне нужно проверить размеры по мере их ввода. Я использовал следующую последовательность:

  1. Пользователь выбирает или печатает, затем перемещает от контроля.
  2. Контроль теряет фокус и уведомляет представление отправляет его идентификатор и текст записи.
  3. View проверяет, какая Shape Program (класс, реализующий интерфейс) создал форму и передает ее ID и текст ввода
  4. Программа Shape возвращает ответ.
  5. Если ответ в порядке, просмотр обновляет правильную запись формы Класс.
  6. Если отклик в порядке, вид говорит Форма через интерфейс, что это в порядке, чтобы переместить фокус на следующую запись.
  7. Если Ответ не в порядке, просмотр смотрит на ответ и используя Интерфейс формы сообщает форме, что делать. Это обычно означает фокус переходит к оскорбительной записи с сообщением, отображающим Пользователь, что случилось.

Преимущество этого подхода в том, что валидация централизована в одном месте для данной Программы Формы. Мне не нужно изменять каждый элемент управления или даже беспокоиться о различных типах элементов управления в форме. Еще тогда, когда я проектировал программное обеспечение, я решил, как будет работать пользовательский интерфейс для текстовых полей, списков, комбинированных окон и т. Д. Кроме того, различные уровни серьезности обрабатываются по-разному.

View позаботится об этом, сообщив Форме, что делать через Интерфейс. Как это на самом деле реализовано, обрабатывается самой формой в реализации интерфейса. Представлению не важно, отображается ли форма желтым для предупреждения и красным для ошибки. Только то, что он обрабатывает эти два уровня.

9
ответ дан 26 November 2019 в 22:30
поделиться

I would like to not have to go control by control by form and create isValid etc per item.

As some level you will have to define what it means to be valid for each control, unless all you care about is that the control has a value of some kind.

That said, there's an ErrorProvider component you can use that works pretty well.

4
ответ дан 26 November 2019 в 22:30
поделиться

We've had good luck with the Noogen ValidationProvider. It's simple for simple cases (data type checks and required fields) and easy to add custom validation for more complex cases.

3
ответ дан 26 November 2019 в 22:30
поделиться

Во всех моих формах я реализую событие isValidating для конкретного элемента управления, о котором идет речь, и если данные не validate У меня есть errorProvider в форме, и я использую его метод SetError (...), чтобы установить ошибку для соответствующего элемента управления с соответствующей информацией о том, почему это неправильно.

edit> Я должен отметить, что я обычно использую При этом выполняется шаблон mvc, поэтому конкретная проверка для этого элемента управления / члена модели происходит в модели, поэтому isValidating выглядит примерно так:

private uicontrol_isValidating(...)
{
    if(!m_Model.MemberNameIsValid())
    {
        errorProvider.SetError(...);
    }
}
2
ответ дан 26 November 2019 в 22:30
поделиться

В любом случае. Или вы можете иметь одно событие проверки, связанное со всеми, или элементы управления, которые требуют аналогичных проверок. Это удалит цикл из кода. Скажем, у вас есть четыре текстовых поля, которые могут иметь только целое число. То, что вы можете сделать, - это создать одно событие для каждого из них. У меня нет никакой IDE, поэтому приведенный ниже код - лучшее, что я могу придумать.

this.textbox1.Validated += <ValidatedEvent>
this.textbox2.Validated += <ValidatedEvent>
this.textbox3.Validated += <ValidatedEvent>
this.textbox4.Validated += <ValidatedEvent>

В случае:

  1. Привести отправителя как текстовое поле.
  2. Проверить, является ли значение в текстовом поле числовым.

И и так далее, у вас есть события в очереди.

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

2
ответ дан 26 November 2019 в 22:30
поделиться

Cycling through controls can work but it's error prone. I worked on a project that used that technique (granted it was a Delphi project not C#) and it did work as expected but it was very difficult to update if a control was added or changed. This may have been correctible. I'm not sure.

Anyway it worked by creating a single event handler which was then attached to each control. The handler would then use RTTI to determine the type of the control. Then it would use the control's name property in a large select statement to find the validation code to run. If the validation failed, an error message was sent to the user and the control was given focus. To make things more complex, the form was divided into several tabs and the proper tab had to be visible for it's child control to get the focus.

So that's my experience.

I would much rather use a Passive View design pattern to remove all business rules from the form and push them into a Presenter class. Depending on the state of your form that may be more work than your willing to invest.

1
ответ дан 26 November 2019 в 22:30
поделиться

Просто грубая идея:


void btnValidate_Click(object sender, EventArgs e)
{
  foreach( Control c in this.Controls )
  {
    if( c is TextBox )
    {
      TextBox tbToValidate = (TextBox)c;
      Validate(tbToValidate.Text);
    }
  }
}

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

1
ответ дан 26 November 2019 в 22:30
поделиться

Почему вы не используете событие Validating? Вы можете иметь одно событие проверки и проверить элементы управления там. Не будет необходимости использовать циклы, и каждый элемент управления будет проверяться при вводе данных.

1
ответ дан 26 November 2019 в 22:30
поделиться

Проверка уже встроена в библиотеку WinForms ,

Каждый объект, полученный из элемента управления , имеет два события с именами Validating и Validated . Также у него есть свойство, называемое CausesValidation . Если для этого параметра установлено значение true (по умолчанию оно равно true), элемент управления участвует в проверке. В противном случае это не так.

Валидация происходит как часть фокуса. Когда вы отключаете элемент управления, его события проверки запускаются. На самом деле фокус событий происходит в определенном порядке. С MSDN :

При изменении фокуса с помощью

Каждый объект, полученный из элемента управления , имеет два события с именами Validating и Validated . Также у него есть свойство, называемое CausesValidation . Если для этого параметра установлено значение true (по умолчанию оно равно true), элемент управления участвует в проверке. В противном случае это не так.

Валидация происходит как часть фокуса. Когда вы отключаете элемент управления, его события проверки запускаются. На самом деле фокус событий происходит в определенном порядке. С MSDN :

При изменении фокуса с помощью

Каждый объект, полученный из элемента управления , имеет два события с именами Validating и Validated . Также у него есть свойство, называемое CausesValidation . Если для этого параметра установлено значение true (по умолчанию оно равно true), элемент управления участвует в проверке. В противном случае это не так.

Валидация происходит как часть фокуса. Когда вы отключаете элемент управления, его события проверки запускаются. На самом деле фокус событий происходит в определенном порядке. С MSDN :

При изменении фокуса с помощью Когда вы отключаете элемент управления, его события проверки запускаются. На самом деле фокус событий происходит в определенном порядке. С MSDN :

При изменении фокуса с помощью Когда вы отключаете элемент управления, его события проверки запускаются. На самом деле фокус событий происходит в определенном порядке. С MSDN :

При изменении фокуса с помощью клавиатура (TAB, SHIFT + TAB и т. д.), позвонив в Select или Методы SelectNextControl или установка ContainerControl .. ::. ActiveControl свойство текущей формы, фокус события происходят в следующем порядке:

  1. Enter
  2. GotFocus
  3. Leave
  4. Validating
  5. Validated
  6. LostFocus

Когда вы меняете фокус с помощью мыши или вызывая метод Focus, события фокуса происходят в следующем заказ:

  1. Введите
  2. GotFocus
  3. LostFocus
  4. Оставьте
  5. Подтвердите
  6. Подтвердите

Если свойство CausesValidation имеет значение установить в false, проверка и Проверенные события подавляются.

Если свойство Cancel объекта Для свойства CancelEventArgs установлено значение true в Подтверждение делегата события, все события что обычно происходит после Валидационные события подавляются.

Также ContainerControl имеет метод, называемый ValidateChildren () , который будет проходить через содержащиеся в нем элементы управления и проверять их.

63
ответ дан 26 November 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: