Обработка события вставки в 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, вы должны иметь возможность перетащить его в свою форму, как и любой другой элемент управления.