Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Удалить из текстбокс неправильно введныый символ


Автор: CityAC 5.11.2007, 12:24
Поле для ввода телефонного номера.
Если пользователь нажал кнопку, отличную от цифры и пробела, введенный символ нужно стереть.
Думал получится имитацией кнопки 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);
            
            }
        
           
        }

Автор: Baa 5.11.2007, 13:01
Код

        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 ;-) т.е. я могу вставить любую гадость

Автор: 1stain 5.11.2007, 15:38
а чем провинился стандартный MaskedTextBox ?

Автор: tea_723 5.11.2007, 17:22
Чуть более развернуто чем Ваа написал.
Это если номер в трех 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

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

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

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

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

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

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

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

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

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

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

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

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

Автор: tol05 6.11.2007, 15:32
ИМХО правильнее было бы заблокировать подобные действа...
Я считаю нужно реализовать только 
Цитата(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;
        }
    }

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

Потом нашел МаскТекстБокс, и успокоился)

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

Автор: CityAC 8.11.2007, 01:54
Сделал так
Код

 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; добавить к коду
 

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