Текстовое поле - проверить ввод перед вставкой - PullRequest
0 голосов
/ 08 декабря 2018

На моем Textbox принимает только буквенно-цифровые символы и подчеркивание с использованием события Keypressed, но у меня возникают проблемы, когда я щелкаю правой кнопкой мыши текстовое поле и вставляю специальные символы и принимаю его

enter image description here

Можно ли оттуда проверить строку перед тем, как нажимать вставить?

Любые ответы помогут, спасибо!

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

TextChanged немного запаздывает, возникает после того, как текст элемента управления был изменен и приводит к неловкому взаимодействию с пользователем.

Для лучшего взаимодействия с пользователем лучше обрабатывать WM_PASTEсообщение и удалите запрещенные символы и вставьте проверенный тест на SelectedText.TextChanged Событие немного запоздало, и пользовательский интерфейс недостаточно дружелюбен, он удаляет символ после изменения свойства текста, что раздражает.Обрабатывая WM_PASTE и OnKeyPress, вы всегда можете держать каретку в ожидаемой пользователем позиции, очищать ввод без каких-либо мерцаний.

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

using System;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Windows.Forms;

public class MyTextBox : TextBox
{
    private const int WM_PASTE = 0x0302;
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern bool MessageBeep(int type);
    protected override void WndProc(ref Message m)
    {
        if (m.Msg != WM_PASTE) { base.WndProc(ref m); }
        else
        {
            var text = SanitizeText(Clipboard.GetText());
            SelectedText = text;
        }
    }
    protected virtual string SanitizeText(string value)
    {
        return Regex.Replace(value ?? "", @"[^a-zA-Z0-9_]", "");
    }
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        var input = e.KeyChar;
        var allowedChars = new char[] { '_', '\b' };
        if (((ModifierKeys & (Keys.Control | Keys.Alt)) != 0) |
            Char.IsLetterOrDigit(e.KeyChar) |
            allowedChars.Contains(input))
        {
            base.OnKeyPress(e);
        }
        else
        {
            e.Handled = true;
            MessageBeep(0);
        }
    }
}
0 голосов
/ 08 декабря 2018

Вы можете

1- Отключить ярлыки для текстового поля, которые отключили бы Ctrl-C, Ctrl-V и вторую строку (назначит пустое контекстное меню без элементов и переопределит исходный контекстменю), и контекстное меню не появится (так как в нем нет элементов):

textBox1.ShortcutsEnabled = false;
textBox1.ContextMenu = new ContextMenu();

2 - Если вы не хотите отключать опцию вставки, вы можете использовать TextChanged событие текстового поля и подтвердитьвставленный текст там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...