Есть ли способ проверить charater в буфере обмена только цифру перед вставкой в текстовое поле C# (оба Ctrl + V и правое нажатие -> Вставить), которые не используют MarkedTextbox.C# проверить символы в буфере обмена при вставке в текстовое поле
ответ
Я ~ думаю ~ вы хотите, чтобы текстовое поле могло принимать только цифры?
Если да, то установить стиль ES_NUMBER на TextBox через SetWindowLong():
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Load += Form2_Load;
}
private void Form1_Load(object sender, EventArgs e)
{
SetNumbersOnlyTextBox(this.textBox1);
}
public const int GWL_STYLE = (-16);
public const int ES_NUMBER = 0x2000;
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
public void SetNumbersOnlyTextBox(TextBox TB)
{
SetWindowLong(TB.Handle, GWL_STYLE, GetWindowLong(TB.Handle, GWL_STYLE) | ES_NUMBER);
}
}
В качестве альтернативы, вы можете Наследовать от TextBox и установить ES_NUMBER в CreateParams():
public class IntegerTextBox : TextBox
{
private const int ES_NUMBER = 0x2000;
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.Style = cp.Style | ES_NUMBER;
return cp;
}
}
}
Как скрыть сообщение, когда я вставляю символ, а не цифру? –
При таком подходе вы не можете. –
Я сомневаюсь, что есть какие-либо проверки перед вставкой в TextBox, я бы предложил подписаться на события KeyDown
и MouseClick
и написать собственную логику.
protected override void OnKeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
// Your logic to read clipboard content and check length.;
}
}
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
// You logic goes here.
}
}
Вы можете получить помощь от MSDN о том, как читать/содержимое буфера обмена записи.
Вы действительно не можете остановить все взаимодействия с буфером обмена/drag'n'drop таким образом ... Прослушивание звука изменения значения более уместно. –
@AlexeiLevenkov благодарит за предложение, но событие «TextChange» срабатывает только после смены фокуса, и возникает вопрос о выполнении действий перед вставкой. –
Добавить правило в текстовом поле изменить текст, чтобы принять только номер:
private string value;
private void textBox1_TextChanged(object sender, EventArgs e)
{
// at this moment value is still old
var oldValue = value;
if (System.Text.RegularExpressions.Regex.IsMatch(textBox1.Text, "[^0-9]"))
{
MessageBox.Show("Please enter numbers only.");
textBox1.Text = oldvalue;
}
else{
value = ((TextBox)sender).Text;
}
}
Кулак, я ввожу 1 цифру. Затем я вставляю символы, а не цифры. Курсор идет в первую позицию текстового поля, как я могу его исправить? @DCODE –
Я не совсем понял вашу точку зрения, могу ли пояснить немного подробнее .. либо вы можете сделать что-то вроде этого. This.focus() –
Во-первых, я вводил «12» в текстовое поле. Затем я вставляю 'ab' после '12'. Теперь курсор переместится в позицию до символа '1'. @DCODE –
Если вы в буквальном смысле хотите использовать onl у позволяют пасты, которые имеют только цифры, то Наследовать от TextBox и ловушки WM_PASTE, подавляя сообщение при желании:
public class DigitsOnlyOnPasteTextBox : TextBox
{
private const int WM_PASTE = 0x302;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_PASTE && Clipboard.ContainsText())
{
int i;
string txt = Clipboard.GetText();
foreach(char c in txt)
{
if (!char.IsNumber(c))
{
return;// suppress default behavior
}
}
}
base.WndProc(ref m); // allow normal processing of the message
}
}
Альтернативный способ будет проверять в случае изменения текста Textbox. –
Вам не нравится drag'n'drop? –
@DCODE: Если я ввожу 1 цифру с клавиатуры, тогда я вставляю несколько символов, а не цифр. Как я могу предотвратить не вставлять эти символы в событие изменения текста –