2015-09-23 1 views
0

Есть ли способ проверить charater в буфере обмена только цифру перед вставкой в ​​текстовое поле C# (оба Ctrl + V и правое нажатие -> Вставить), которые не используют MarkedTextbox.C# проверить символы в буфере обмена при вставке в текстовое поле

+1

Альтернативный способ будет проверять в случае изменения текста Textbox. –

+0

Вам не нравится drag'n'drop? –

+0

@DCODE: Если я ввожу 1 цифру с клавиатуры, тогда я вставляю несколько символов, а не цифр. Как я могу предотвратить не вставлять эти символы в событие изменения текста –

ответ

0

Я ~ думаю ~ вы хотите, чтобы текстовое поле могло принимать только цифры?

Если да, то установить стиль 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; 
     } 
    } 

} 
+0

Как скрыть сообщение, когда я вставляю символ, а не цифру? –

+0

При таком подходе вы не можете. –

0

Я сомневаюсь, что есть какие-либо проверки перед вставкой в ​​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 о том, как читать/содержимое буфера обмена записи.

+0

Вы действительно не можете остановить все взаимодействия с буфером обмена/drag'n'drop таким образом ... Прослушивание звука изменения значения более уместно. –

+0

@AlexeiLevenkov благодарит за предложение, но событие «TextChange» срабатывает только после смены фокуса, и возникает вопрос о выполнении действий перед вставкой. –

1

Добавить правило в текстовом поле изменить текст, чтобы принять только номер:

 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; 
        } 
       } 
+0

Кулак, я ввожу 1 цифру. Затем я вставляю символы, а не цифры. Курсор идет в первую позицию текстового поля, как я могу его исправить? @DCODE –

+0

Я не совсем понял вашу точку зрения, могу ли пояснить немного подробнее .. либо вы можете сделать что-то вроде этого. This.focus() –

+0

Во-первых, я вводил «12» в текстовое поле. Затем я вставляю 'ab' после '12'. Теперь курсор переместится в позицию до символа '1'. @DCODE –

0

Если вы в буквальном смысле хотите использовать 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 
    } 

}