Обработка события вставки в c#

Я создал статическое числовое текстовое поле класса, но я не хочу контролировать, что пользователи вставляют в текстовое поле te. Для обработки события вставки я использую событие textchanged:

        static public void textChanged(EventArgs e, TextBox textbox, double tailleMini, double tailleMaxi, string carNonAutorisé)
    {            
        //Recherche dans la TextBox, la première occurrence de l'expression régulière.
        Match match = Regex.Match(textbox.Text, carNonAutorisé);
        /*Si il y a une Mauvaise occurence:
         *   - On efface le contenu collé
         *   - On prévient l'utilisateur 
         */
        if (match.Success)
        {
            textbox.Text = "";
            MessageBox.Show("Votre copie un ou des caractère(s) non autorisé", "Attention", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        tailleTextBox(textbox, tailleMini, tailleMaxi);
    }

в другом классе я использую этот статический метод, как это

    private void tbxSigné_TextChanged(object sender, EventArgs e)
    {
        FiltreTbx.textChanged(e, tbxSigné, double.MinValue, double.MaxValue, @"[^d,;.-]");
    }

чего я не хочу делать, так это что-то вроде этого:

  if (match.Success)
    {
        textbox.Text = //Write the text before users paste in the textbox;

    }

у кого есть идеи, пожалуйста?

1 ответов


прежде всего, вы рассматривали с помощью элемент управления maskedtextbox вместо? Он может обрабатывать фильтрацию символов для вас.

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

public Form1()
{
    InitializeComponent();

    FiltreTbx.AddTextBoxFilter(tbxSigné,
                               double.MinValue, double.MaxValue,
                               @"[^\d\,\;\.\-]");
}

этой AddTextBoxFilter - Это новый статический метод, который вы только один раз позвонить. Он добавит обработчик TextChanged в TextBox. Этот обработчик использует закрытие для хранения в тексте коробка.

ваш статический метод получил дополнительный параметр для передачи этого предыдущего текста.

public class FiltreTbx
{
    public static void AddTextBoxFilter(TextBox textbox,
                                        double tailleMini, double tailleMaxi,
                                        string carNonAutorisé)
    {
        string previousText = textbox.Text;

        textbox.TextChanged +=
            delegate(object sender, EventArgs e)
            {
                 textChanged(e, textbox, tailleMini, tailleMaxi,
                             carNonAutorisé, previousText);
                 previousText = textbox.Text;
            };
    }

    static public void textChanged(EventArgs e, TextBox textbox,
                                   double tailleMini, double tailleMaxi,
                                   string carNonAutorisé, string previousText)
    {
        //Recherche dans la TextBox, la première occurrence de l'expression régulière.
        Match match = Regex.Match(textbox.Text, carNonAutorisé);
        /*Si il y a une Mauvaise occurence:
         *   - On efface le contenu collé
         *   - On prévient l'utilisateur 
         */
        if (match.Success)
        {
            // Set the Text back to the value it had after the previous
            // TextChanged event.
            textbox.Text = previousText;
            MessageBox.Show("Votre copie un ou des caractère(s) non autorisé",
                            "Attention", MessageBoxButtons.OK,
                            MessageBoxIcon.Information);
        }
        tailleTextBox(textbox, tailleMini, tailleMaxi);
    }
}

Я не уверен, что tailleTextBox предполагается сделать точно, вы не включили этот исходный код, но я подозреваю, что он обеспечивает минимальные и максимальные значения?

альтернативным решением

если вы хотите обработать операцию вставки самостоятельно, прежде чем это произойдет, вам придется перехватить WM_PASTE сообщение в текстовом поле. Один из способов сделать это было бы путем создания специализированного элемента управления:

using System;
using System.Windows.Forms;

class MyTextBox : TextBox
{
    private const int WM_PASTE = 0x0302;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg != WM_PASTE)
        {
            // Handle all other messages normally
            base.WndProc(ref m);
        }
        else
        {
            // Some simplified example code that complete replaces the
            // text box content only if the clipboard contains a valid double.
            // I'll leave improvement of this behavior as an exercise :)
            double value;
            if (double.TryParse(Clipboard.GetText(), out value))
            {
                Text = value.ToString();
            }
        }
    }
}

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