Страницы

Поиск по вопросам

суббота, 7 марта 2020 г.

Ввод в TextBox только цифр и английских символов

#c_sharp #net #wpf


Как наиболее правильно запретить ввод в TextBox символов любой раскладки кроме английской
и цифр. Желательно не сравнивая в цикле каждый символ строки с шаблоном.



private void validationTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            TextBox a = (TextBox)sender;
            if (e.Key < Key.D0 || e.Key > Key.F)
                e.Handled = true;
            //code
        }

    


Ответы

Ответ 1



У меня работает код, основанный на этом ответе: void OnPreviewTextInput(object sender, TextCompositionEventArgs e) { e.Handled = !e.Text.All(IsGood); } private void OnPasting(object sender, DataObjectPastingEventArgs e) { var stringData = (string)e.DataObject.GetData(typeof(string)); if (stringData == null || !stringData.All(IsGood)) e.CancelCommand(); } bool IsGood(char c) { if (c >= '0' && c <= '9') return true; if (c >= 'a' && c <= 'f') return true; if (c >= 'A' && c <= 'F') return true; return false; } Вставка работает, если в ней нет запрещённых символов.

Ответ 2



[DllImport("user32.dll", SetLastError = true)] private static extern int GetWindowThreadProcessId( [In] IntPtr hWnd, [Out, Optional] IntPtr lpdwProcessId ); [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll", SetLastError = true)] private static extern ushort GetKeyboardLayout( [In] int idThread ); private int GetKeyboardLayout() { return GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero)); } private void validationTextBox_KeyDown(object sender, KeyEventArgs e) { TextBox a = (TextBox)sender; if (e.Key >= Key.D0 && e.Key <= Key.Z) { if ((e.Key >= Key.A && e.Key <= Key.Z) && (GetKeyboardLayout() != 1033)) e.Handled = true; } else e.Handled = true; }

Комментариев нет:

Отправить комментарий