Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удалить из текстбокс неправильно введныый символ 
:(
    Опции темы
CityAC
Дата 5.11.2007, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 3.11.2006
Где: Украина Горловка

Репутация: нет
Всего: 1



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

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
 private void PhoneTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            const uint VK_BACK = 8;
            IntPtr NIL = new IntPtr();
            if (e.KeyCode != Keys.Back && e.KeyCode != Keys.Space && (e.KeyValue < 48 || e.KeyValue > 58))
            {
                MessageBox.Show("Только цифры и пробел");
                SendMessage(PhoneTextBox.Handle, VK_BACK, NIL, NIL);
            
            }
        
           
        }

--------------------
Вижу цель, не вижу припятствий.  
PM MAIL ICQ   Вверх
Baa
Дата 5.11.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



Код

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            string temp = Regex.Replace(textBox1.Text, @"[^0-9\s]", "");
            int iSelectionStart = textBox1.SelectionStart;
            if(temp.Length != textBox1.Text.Length)
            {
                textBox1.Text = temp;
                textBox1.SelectionStart = iSelectionStart == 0 ? 0 : iSelectionStart - 1;
            }    
        }

Может так? Твой вариант не учитывает ctrl+v ;-) т.е. я могу вставить любую гадость

Это сообщение отредактировал(а) Baa - 5.11.2007, 13:11


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
1stain
Дата 5.11.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 4
Всего: 40



а чем провинился стандартный MaskedTextBox ?


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
tea_723
Дата 5.11.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 13.9.2007

Репутация: нет
Всего: нет



Чуть более развернуто чем Ваа написал.
Это если номер в трех textbox вводить. В C# сам переведешь или помочь?


Private Sub txtSelPage_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _Handles txtFax1.KeyPress, txtFax2.KeyPress, txtFax3.KeyPress
        'This allows only numeric keypress.

        Dim tb As TextBox = sender

        Dim NChars As String = "1234567890,-()" & Chr(8)

        If NChars.IndexOf(e.KeyChar) = -1 Then

            ' Invalid Character

            e.Handled = True

        ElseIf e.Handled = False And tb.Text.Length = 0 Then

            tb.Text = e.KeyChar

            e.Handled = True

            tb.SelectionStart = 2

        End If

    End Sub
PM MAIL   Вверх
CityAC
Дата 6.11.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 3.11.2006
Где: Украина Горловка

Репутация: нет
Всего: 1



Цитата(tea_723 @  5.11.2007,  17:22 Найти цитируемый пост)
Это если номер в трех textbox вводить. В C# сам переведешь или помочь?

tea_723, Если можно то переведи, я в VB не силен

--------------------
Вижу цель, не вижу припятствий.  
PM MAIL ICQ   Вверх
Baa
Дата 6.11.2007, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



Цитата(CityAC @ 6.11.2007,  10:17)
Цитата(tea_723 @  5.11.2007,  17:22 Найти цитируемый пост)
Это если номер в трех textbox вводить. В C# сам переведешь или помочь?

tea_723, Если можно то переведи, я в VB не силен

Так а чем не устроил мой вариант или вариант с MaskedTextBox'ом?


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
tol05
Дата 6.11.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



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


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Baa
Дата 6.11.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: нет
Всего: 12



Цитата(tol05 @ 6.11.2007,  13:27)
а мне другое непонятно: зачем ждать когда пользователь нажмет клавишу, анализировать символ и потом его стирать, когда можно просто подцепиться на события нажатия клавиши и или пропускать символ в текстбокс, или нет.

А если я нажму правой кнопкой мыши и выберу вставить?


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
CityAC
Дата 6.11.2007, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 3.11.2006
Где: Украина Горловка

Репутация: нет
Всего: 1



Цитата(tol05 @  6.11.2007,  13:27 Найти цитируемый пост)
а мне другое непонятно: зачем ждать когда пользователь нажмет клавишу, анализировать символ и потом его стирать, когда можно просто подцепиться на события нажатия клавиши и или пропускать символ в текстбокс, или нет.

ОК я за. Я подцеплялся, но не знаю как не пропустить символ
Вставка ctrl+v для меня не критична. Если пользователь хочет поизвращаться таким методом - то это его проблемы

Цитата(Baa @  6.11.2007,  13:21 Найти цитируемый пост)
Так а чем не устроил мой вариант или вариант с MaskedTextBox'ом?

Когда вводишь мобильные - все ОК, но когда городские - здесь путаница (коды могут быть 3-х,4-х, 5-ти значные)

Это сообщение отредактировал(а) CityAC - 6.11.2007, 15:28
--------------------
Вижу цель, не вижу припятствий.  
PM MAIL ICQ   Вверх
tol05
Дата 6.11.2007, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



ИМХО правильнее было бы заблокировать подобные действа...
Я считаю нужно реализовать только 
Цитата(CityAC @  5.11.2007,  11:24 Найти цитируемый пост)
Если пользователь нажал кнопку, отличную от цифры и пробела, введенный символ нужно стереть.
и все. 
Да и юзеру так спокойнее будет. Например кинул я из буфера 34pwd~6. Какие символы выбрасывать будем?

ИМХО - много возни возле одного только контрола, а он в программе не один наверняка. 
Если на каждый контрол писать по три страницы кода, как потом такой код сопровождать, апгрейдить? 
И потом, если допускать много вариантов, тогда и много валидаций нужно делать, ReGex добавлять и т.д.

Нужно упростить. Но это сугубо моя точка зрения.

P.S. не успел... Как не пропустить? Да в обработчике KeyPress (или KeyDown, какой лучше подойдет - смотри сам) проверять код клавиши и если не тот - делать 
e.Handled = true 
и выходить. 
перехватывать нужно окном - Form.KeyPreview Property или WndProc формы переопределить и т.д.
Посмотри. на форуме много вариантов было
вот набросал пример, пропускает только 0 smile
Код

public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            KeyPreview = true;
        }

        
        protected override void OnKeyDown(KeyEventArgs e)
        {
            if(e.KeyCode != Keys.D0)
            {
                e.Handled = true;
                return;
            }
        }

        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if(e.KeyChar != '0')
            e.Handled = true;
            return;
        }
    }


Это сообщение отредактировал(а) tol05 - 6.11.2007, 15:52


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
KLUBS
  Дата 7.11.2007, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 11.2.2007
Где: Спб

Репутация: нет
Всего: 1



Мне когда-то тоже нужел был такой textbox, я делал так:
есть начальная длина текста в контроле, после изменений знаем положение каретки, путем мат. операций получаем строку введенную, или вставленную, ее то и начинаеем кромсать smile

Потом нашел МаскТекстБокс, и успокоился)
PM MAIL ICQ Skype   Вверх
Experimenter
Дата 7.11.2007, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



Дык еще у чаров (символов) свойства имеются IsDigit, IsWhitespace


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
CityAC
Дата 8.11.2007, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 3.11.2006
Где: Украина Горловка

Репутация: нет
Всего: 1



Сделал так
Код

 private void PhoneTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar) == false && Char.IsWhiteSpace(e.KeyChar) == false && e.KeyChar!='\b'
                && e.KeyChar != '(' && e.KeyChar != ')')
            {
                e.Handled = true;
                
                return;
            }
        }


И хотя tol05 писал:
Цитата(tol05 @  6.11.2007,  15:32 Найти цитируемый пост)
 Да в обработчике KeyPress (или KeyDown, какой лучше подойдет - смотри сам) проверять код клавиши и если не тот - делать e.Handled = true и выходить. перехватывать нужно окном - Form.KeyPreview Property или WndProc формы переопределить и т.д.

Я переопределил  KeyPress  в TextBox и вроде работает. А вообще спасибо, tol05, столько было написано, а реально нужно было  
 e.Handled = true; добавить к коду
 

Это сообщение отредактировал(а) CityAC - 8.11.2007, 02:01
--------------------
Вижу цель, не вижу припятствий.  
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.