Текстовое поле только для чисел [дубликат]

107
06 мая 2021, 19:00
На этот вопрос уже дан ответ здесь:
Создание маски и ограничение ввода символов в TextBox? (1 ответ)
Закрыт 1 год назад.

Перепробовал уже очень много способов, несколько часов гуглежа.. результат ноль.

xctk:IntegerUpDown и другие updown в этой либе свободно позволяют писать текст в них кроме чисел, просто выключая кнопки UpDown;

ещё способ, он вроде бы не плохой, но позволяет вставить обычный текст на ctrl + v;

Answer 1

Спасибо давайте Андрею с его вариантом, в котором я доработал Pasting:

private void Pasting(object sender, DataObjectPastingEventArgs e)
{
    if (e.DataObject.GetDataPresent(typeof(string)))
    {
        var pastedText = (string)e.DataObject.GetData(typeof(string));
        DataObject dataObject = new DataObject();
        dataObject.SetText(GetValidInput(pastedText));
        e.DataObject = dataObject;
        return;
    }
    e.CancelCommand();
}
private string GetValidInput(string Input)
{
    return Regex.Replace(Input, @"[^0-9]", "");
}

(И ещё немного по мелочам). Это лучший из вариантов реализации TextBox с ограниченным вводом из всех, что я встречал.

Но до этого, посмотрев на этот вариант, сделал это (работает нормально, не надо заморачиваться со всякими классами, но вариант выше лучше):

private static int LastSelectionStart;
private static string LastText;
private void InputTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    if (InputTextBox.Text.Length > 0)
    {
        if (!Int32.TryParse(InputTextBox.Text, out int Int)) //тут можно установить ограничение по макс. размеру от байт до шорт, может даже можно бигинт припилить; ещё можно просто ограничение припилить с помощью out'а у трайпарсе
        {
            InputTextBox.Text = LastText;
            InputTextBox.SelectionStart = LastSelectionStart;
        }
        else LastText = InputTextBox.Text;
    }
    else LastText = "";
}
private void InputTextBox_SelectionChanged(object sender, RoutedEventArgs e)
{
    LastSelectionStart = InputTextBox.SelectionStart;
}

Однако этот вариант, в отличие от варианта выше, как вариант Андрея с его пастингом, при вставке из буфера не фильтрует, а только проверяет текст на наличие не-цифр и в случае их присутствия не пропускает весь вставленный текст.

READ ALSO
Как лучше читать читать данные из DBF в C#

Как лучше читать читать данные из DBF в C#

Задача: пользователи раз в месяц грузят данные от поставщиков в базуФайлы приходят разных размеров

110
Цикл for ведет себя странно (С# WinForms)

Цикл for ведет себя странно (С# WinForms)

В одном цикле я постоянно получаю SystemArgumentOutOfRangeException:

110
Передача массива в параметр SQL

Передача массива в параметр SQL

Возможна ли передача массива в параметр SQL? Если я хочу массово удалить, или проставить статусы списку заказов, как это сделать?

95
C# Шаблоны и Списки

C# Шаблоны и Списки

Есть класс Colum<T>, Есть класс Row со списком List<Colum>И есть проблема, List<Colum> требует указать ещё тип T аки List<Colum<int>>, но мне не нужно...

83