Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > TextBox


Автор: Jlekc 12.5.2005, 16:49
как вводить в ТекстовеПоля тока определенные символы, например цыфры.
В других языках есть метод restrict, пытаюсь нати аналог, ибо отслеживать нажатия клавиш тупо

Автор: redrick 12.5.2005, 16:55
может есть чтото типа FormatedTextBox со свойствами, задающими формат ввода данных ?

Автор: AntonSaburov 12.5.2005, 17:21
Я делал так - в событие Valideting (или что-то подобное) пытался сконвертировать в число и ловил эксепшн. Что-то вроде такого (это просто типа эскиза к коду)

Код

private void txtValue_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
    decimal val_new = paramValue;
    TextBox d = (TextBox)sender;
    try
    {
        val_new = Convert.ToInt32(d.Text); break;
    }
    catch
    {
        MessageBox.Show("Invalid number format");
        e.Cancel = true;
    }
}

Автор: Jlekc 12.5.2005, 17:39
а есе я хачу разрешить вводить: точки, запятые, и чот есе

Автор: AntonSaburov 12.5.2005, 18:53
Ну тогда проверяй на доступные символы теми же регулярными выражениями.

Автор: Jlekc 12.5.2005, 21:25
яс, просто думал уже предвдели ткое

Автор: mr.DUDA 13.5.2005, 09:09
Цитата(Jlekc @ 12.5.2005, 21:25)
яс, просто думал уже предвдели ткое

Это ж стандартный TextBox, где ему smile

Нуна или самостоятельно в Validate проверять формат строки, или юзать какой-нить более продвинутый компонент (с http://www.codeproject.com/cs/miscctrl/ например).

Автор: Jlekc 13.5.2005, 16:41
заль, лада не проблема,
просто видел ТекстБоксы с встроеными валидаторами, инфу на них скидывали как RegExp и не парились с оброботкой на нажатия клавиш

Автор: lioness 20.9.2006, 11:33
А у меня тут такая небольшенькая странность с Validating  Может, где спрашивали уже, но я не нашла. 
Вот пример проверки TextBox, чтобы пустым не отправляли. 
Код

        private void txbPath_Validating(object sender, CancelEventArgs e)
        {
            string error = null;

            if (((Control)sender).Text.Trim().Length == 0)
            {
                error = "Please enter a path";
                e.Cancel = true;
            }
       this.errorProviderPath.SetError((Control)sender, error);

В дизайнере, как и положено, строка стоит
Код

           this.txbPath.Validating += new System.ComponentModel.CancelEventHandler(this.txbPath_Validating);
 

При попытке щелкнуть на кнопку для отправки - высвечивается восклицательный знак возле текстбокса.   НО !!! 
Только если я предварительно щелкну по пустому полю тексбокса. Ну или я что-то туда записАла, а потом стерла. Если поле остаётся девственно чистым, то бишь я до него вообще не дотрагивалась, и пытаюсь отправить "пустышку", то Validating не происходит вощщее. Я ставила остановы - я совсем не прихожу по прерыву в это событие.
Как будто бы надо еще на TextBox поставить что-то типа "OnValidation".  Я выдумываю - такого проперти нет, но очень хочется.  smile 
Конечно, можно на кнопке-отправке поставить проверку на пустоту  ".Trim.Lenght == 0" и не допустить "пустой" отправки (что я сейчас и сделала), но принципиально - почему Validation  начинает валидировать только после "касания" текстового поля?  

Автор: $tatic 20.9.2006, 17:48
Цитата(lioness @  20.9.2006,  12:33 Найти цитируемый пост)
При попытке щелкнуть на кнопку для отправки - высвечивается восклицательный знак возле текстбокса.   НО !!! 
Только если я предварительно щелкну по пустому полю тексбокса. Ну или я что-то туда записАла, а потом стерла. Если поле остаётся девственно чистым, то бишь я до него вообще не дотрагивалась, и пытаюсь отправить "пустышку", то Validating не происходит вощщее. Я ставила остановы - я совсем не прихожу по прерыву в это событие.

Валидация проходит вот в такой цепочке событий:
1. Enter 
2. GotFocus 
3. Leave
4. Validating 
5. Validated 
6. LostFocus
или
1. Enter
2. GotFocus 
3. LostFocus 
4. Leave 
5. Validating
6. Validated
Т.е., чтобы прошла валидация необходимо, чтобы контрол потерял фокус.

Может проще определить свой контрол на базе TextBox?

Автор: Exception 20.9.2006, 17:53
Цитата(lioness @  20.9.2006,  12:33 Найти цитируемый пост)
олько если я предварительно щелкну по пустому полю тексбокса. Ну или я что-то туда записАла, а потом стерла.


Validating проходит именно при потере контролом фокуса.

Автор: ivashkanet 20.9.2006, 17:54
 smile 
$tatic, а где ты выкапал инфу о очередностях событий? 
Или сам вычислил?

Автор: $tatic 20.9.2006, 18:00
ivashkanet, MSDN :: .NET Framework Class Library :: Control.Validating Event

Добавлено @ 18:10 
А вообще валидацию стандартным способом я бы не рекомендовал проводить.
Я однажды запускал пример от MS, в котором производится проверка на валидность е-мэйла. Так вот я не мог корректно закрыть это приложение, поскольку его блокировал валидатор. И вообще не мог перейти к другому контролу на форме, поскольку валидация отменяет и потерю фокуса. Так что будьте с этим осторожны.

Автор: mr.DUDA 20.9.2006, 21:35
Можно у формы подписываться на Closing и там дёргать метод Validate каждого контрола - если хотя бы один скажет что "нельзя", то выставлять e.Cancel и форма не закроется.

Автор: $tatic 21.9.2006, 12:27
mr.DUDA, про что я и писал в предыдущем посте. Т.е. пока юзер все правильно не введет, то и "Отмену" нажать не сможет smile

Автор: pavelkoptev 21.9.2006, 12:50
Цитата

про что я и писал в предыдущем посте. Т.е. пока юзер все правильно не введет, то и "Отмену" нажать не сможет


тут есть такая шняшка - у баттона закрытия формы(да и еще у других компонентоф если надо) можно отключить их участие в Validate.... свойство CausesValidation(если не путаю) ставишь в FALSE и можешь форму етой кнопкой закрывать спокойно....

Автор: $tatic 21.9.2006, 13:28
pavelkoptev, нет. CausesValidation работает не так. Оно управляет валидацией того контрола, на котором установлено/сброшено. Если сбросить CausesValidation для кнопки, то эта кнопка не будет вызывать событие Validation. Но ведь все равно валидность кнопки никто не проверяет smile. А вот другие контролы порождать валидацию будут, поэтому фокус они тоже не отдадут, в т.ч. и при попытке закрыть окно "крестиком" и другими способами.

Автор: lioness 21.9.2006, 15:56
Да, CausesValidation можно просто у кнопки отключить и форма закроется. Таким образом можно освободить, например, "cancel", чтобы закрыть форму без всяких лишних вопросов.
Но действительно Validating  жутко назойливый и действительно уж если попал с этим восклицательным знаком, то пока не напишешь ПРАВИЛЬНО - не отстанет. Из души вынет.

А тут еще чудесатее и чудесатее. Я жаловалась, что пока поле "нетронутое" валидейшн не сработает. Но если TextBox-а  два, то тогда первое поле СРАЗУ среагирует на отправку пустышки, как я и хотела видеть реакцию, но при одном поле.  Жму commit и одно (первое пустое) поле послушно зажигается красненьким знаком. Что LostFocus и от количества текс-боксов "теряется"?

Автор: pavelkoptev 21.9.2006, 16:20
Цитата(lioness @ 21.9.2006,  15:56)
Да, CausesValidation можно просто у кнопки отключить и форма закроется. Таким образом можно освободить, например, "cancel", чтобы закрыть форму без всяких лишних вопросов.
Но действительно Validating  жутко назойливый и действительно уж если попал с этим восклицательным знаком, то пока не напишешь ПРАВИЛЬНО - не отстанет. Из души вынет.

А тут еще чудесатее и чудесатее. Я жаловалась, что пока поле "нетронутое" валидейшн не сработает. Но если TextBox-а  два, то тогда первое поле СРАЗУ среагирует на отправку пустышки, как я и хотела видеть реакцию, но при одном поле.  Жму commit и одно (первое пустое) поле послушно зажигается красненьким знаком. Что LostFocus и от количества текс-боксов "теряется"?

господа!!! я тут схожу с ума... был согласен с lioness полностью до сообщения от $tatic.... попробовал как я выше писал - непахает - а раньше работало, щоб мне фсю жизнь без кряков жить работало, да и читал об этом гдето... хто рассудит???

Автор: mr.DUDA 21.9.2006, 22:50
Код - в студию. Товарищи, здесь телепатов нет.

З.Ы. а лучше весь проект (который "глючный") в зип - и приаттачить к посту.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)