Вы могли бы сделать ...
substr(x, 15, nchar(x)-4)
или программно
prefix = "protein_class_"
postfix = ".txt"
substr(x, nchar(prefix)+1, nchar(x)-nchar(postfix))
В моем собственном приложении мне нужно проверить размеры по мере их ввода. Я использовал следующую последовательность:
Преимущество этого подхода в том, что валидация централизована в одном месте для данной Программы Формы. Мне не нужно изменять каждый элемент управления или даже беспокоиться о различных типах элементов управления в форме. Еще тогда, когда я проектировал программное обеспечение, я решил, как будет работать пользовательский интерфейс для текстовых полей, списков, комбинированных окон и т. Д. Кроме того, различные уровни серьезности обрабатываются по-разному.
View позаботится об этом, сообщив Форме, что делать через Интерфейс. Как это на самом деле реализовано, обрабатывается самой формой в реализации интерфейса. Представлению не важно, отображается ли форма желтым для предупреждения и красным для ошибки. Только то, что он обрабатывает эти два уровня.
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.
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.
Во всех моих формах я реализую событие isValidating для конкретного элемента управления, о котором идет речь, и если данные не validate У меня есть errorProvider в форме, и я использую его метод SetError (...), чтобы установить ошибку для соответствующего элемента управления с соответствующей информацией о том, почему это неправильно.
edit> Я должен отметить, что я обычно использую При этом выполняется шаблон mvc, поэтому конкретная проверка для этого элемента управления / члена модели происходит в модели, поэтому isValidating выглядит примерно так:
private uicontrol_isValidating(...)
{
if(!m_Model.MemberNameIsValid())
{
errorProvider.SetError(...);
}
}
В любом случае. Или вы можете иметь одно событие проверки, связанное со всеми, или элементы управления, которые требуют аналогичных проверок. Это удалит цикл из кода. Скажем, у вас есть четыре текстовых поля, которые могут иметь только целое число. То, что вы можете сделать, - это создать одно событие для каждого из них. У меня нет никакой IDE, поэтому приведенный ниже код - лучшее, что я могу придумать.
this.textbox1.Validated += <ValidatedEvent>
this.textbox2.Validated += <ValidatedEvent>
this.textbox3.Validated += <ValidatedEvent>
this.textbox4.Validated += <ValidatedEvent>
В случае:
И и так далее, у вас есть события в очереди.
Надеюсь, это поможет.
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.
Просто грубая идея:
void btnValidate_Click(object sender, EventArgs e)
{
foreach( Control c in this.Controls )
{
if( c is TextBox )
{
TextBox tbToValidate = (TextBox)c;
Validate(tbToValidate.Text);
}
}
}
Вы можете вставить текстовые поля внутри панели и проходить там только элементы управления, если Вы хотите избежать циклического перебора других элементов управления.
Почему вы не используете событие Validating? Вы можете иметь одно событие проверки и проверить элементы управления там. Не будет необходимости использовать циклы, и каждый элемент управления будет проверяться при вводе данных.
Проверка уже встроена в библиотеку 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 свойство текущей формы, фокус события происходят в следующем порядке:
- Enter
- GotFocus
- Leave
- Validating
- Validated
- LostFocus
Когда вы меняете фокус с помощью мыши или вызывая метод Focus, события фокуса происходят в следующем заказ:
- Введите
- GotFocus
- LostFocus
- Оставьте
- Подтвердите
- Подтвердите
Если свойство CausesValidation имеет значение установить в false, проверка и Проверенные события подавляются.
Если свойство Cancel объекта Для свойства CancelEventArgs установлено значение true в Подтверждение делегата события, все события что обычно происходит после Валидационные события подавляются.
Также ContainerControl имеет метод, называемый
ValidateChildren ()
, который будет проходить через содержащиеся в нем элементы управления и проверять их.