温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C# 中怎么利用TextBox输入数字

发布时间:2021-08-06 15:30:29 来源:亿速云 阅读:267 作者:Leah 栏目:编程语言

C# 中怎么利用TextBox输入数字,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1、重写键盘事件OnKeyPress()

键盘输入的字符可以通过重写c# textbox数字控件的OnKeyPress()事件处理,见如下代码:

protected override void OnKeyPress(KeyPressEventArgs e)  // 屏蔽非数字键  {      base.OnKeyPress(e);
  •     if (this.ReadOnly)  // 只读, 不处理  

  •     {  

  •         return;  

  •     }  

  •             if ((int)e.KeyChar <= 32)  // 特殊键(含空格), 不处理  

  •     {  

  •         return;  

  •     }  

  •         if (!char.IsDigit(e.KeyChar))  // 非数字键, 放弃该输入  

  •     {  

  •         e.Handled = true;  

  •         return;  

  •     }  

2、重写命令键处理方法ProcessCmdKey()

可以在ProcessCmdKey()中捕获快捷键Ctrl+V操作。首先要清除当前的选择文本,然后读取剪切板ClipBoard中的内容,最后通过模拟键盘输入的方式”输入“ClipBoard的内容。需要指出,在ProcessCmdKey()方法中不能使用静态方法 SendKeys.Send(),但可以通过控件的WndProc()方法发送字符消息以达到模拟键盘录入的目的。见如下代码:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)    {      if (keyData == (Keys)Shortcut.CtrlV)  // 快捷键 Ctrl+V 粘贴操作
  •     {  

  •         this.ClearSelection();  

  •         string text = Clipboard.GetText();  

  •         for (int k = 0; k < text.Length; k++) // can not use SendKeys.  

  •         {  

  •             // 通过消息模拟键盘输入, SendKeys.Send()静态方法不行  

  •             SendCharKey(text[k]);  

  •         }  

  •         return true;      

  • }  

  •     return base.ProcessCmdKey(ref msg, keyData);  

private void SendCharKey(char c)  // 通过消息模拟键盘录入  {      Message msg = new Message();
  •     msg.HWnd = this.Handle;  

  •     msg.Msg = WM_CHAR;  // 输入键盘字符消息 0x0102  

  •     msg.WParam = (IntPtr)c;  

  •     msg.LParam = IntPtr.Zero;  

  •     base.WndProc(ref msg);  


3、重写消息处理方法WndProc()

可以在定制c# textbox数字控件中创建无内容的上下文菜单对象,从而屏蔽该菜单,方法是在定制控件的构造函数中增加如下代码:

public class CustomTextBox: TextBox  {      // 创建无内容菜单对象, 等价屏蔽该控件的上下文菜单
  •     this.ContextMenu = new ConTextMenu();  

  •   } 

  • 由于上下文菜单的Paste操作对应Windows的WM_PASTE消息,于是可以在控件的WndProc()方法中捕获该消息,然后获得剪切板 ClipBoard中的内容,最后通过SendKeys.Send()方法模拟键盘录入操作。需要注意,这里不能调用前面ProcessCmdKey() 中模拟键盘输入函数SendCharKey()。见如下代码:

    protected override void WndProc(ref Message m)  // 捕获Mouse的Paste消息  {      if (m.Msg == WM_PASTE)  // 选择上下文菜单的"粘贴"操作    {          this.ClearSelection();          SendKeys.Send(Clipboard.GetText());  // 模拟键盘输入      }      else     {          base.WndProc(ref m);      }  }

    4、消除选择ClearSelection()、删除字符DeleteText()

    还必须分析前面代码中的两个函数:
    ClearSelection()用以清除当前的选择文本,即清除this.SelectedText
    DeleteText()则删除当前字符
    需要指出其中的技巧,就是转换Delete键操作为BackSpace操作。此外,函数DeleteText()还需要确定当前的this.SelectionStart值。具体代码如下:

    private void ClearSelection() // 清除当前TextBox的选择  {      if (this.SelectionLength == 0)      {          return;      }      int selLength = this.SelectedText.Length;    this.SelectionStart += this.SelectedText.Length;  // 光标在选择之后      this.SelectionLength = 0;      for (int k = 1; k <= selLength; k++)      {          this.DeleteText(Keys.Back);      }  }
    private void DeleteText(Keys key) // 删除字符并计算SelectionStart值  {      int selStart = this.SelectionStart;      if (key == Keys.Delete)  // 转换Delete操作为BackSpace操作      {          selStart += 1;          if (selStart > base.Text.Length)          {              return;          }      }      if (selStart == 0 || selStart >base.Text.Length)  // 不需要删除      {          return;      }      if (selStart == 1 && base.Text.Length == 1)      {          base.Text = "";          base.SelectionStart = 0;      }      else  // selStart > 0      {          base.Text = base.Text.Substring(0, selStart - 1) +              base.Text.Substring(selStart, base.Text.Length - selStart);          base.SelectionStart = selStart - 1;      }  }


看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI