只能对数值操作的TextBox[1]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 hbxtlhx 的 blog

当界面上要用户输入只有数字的字符时,默认的textbox是不能胜任的,网上有很多网友们提供了很多的做法,我总结了一下写了一个在c#下的实现,做到了如下的几点:
1:只能输入类似这样的字符:-123456.789;1234.789;
2:在输入的字符串中不能存在两个点符:12456.78//正确;12.456.78//不正确;
3:如果表示负数可以在字符串的最前面加一个减号“-”,也只能加到弟一个字符的位置;
4:可以用复制粘帖功能和菜单功能,但是只对能正确格式的字符串有效,比如:12.34可以,abc不可以;
5:只是得到一个字符串,还可以在这个基础上再改进自己所需的,经如添加对十六进制的支持等。
代码如下在.net下用c#写的:

using system;
using system.windows.forms;

namespace numtextbox
{
 /// <summary>
 /// numtextbox 的摘要说明。
 /// </summary>
 public class textboxnumex:system.windows.forms.textbox
 {
  public const int wm_contextmenu = 0x007b;//右键菜单消息 
  public const int wm_char = 0x0102;       //输入字符消息(键盘输入的,输入法输入的好像不是这个消息)
  public const int wm_cut = 0x0300;        //程序发送此消息给一个编辑框或combobox来删除当前选择的文本
  public const int wm_copy = 0x0301;       //程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板
  public const int wm_paste = 0x0302;      //程序发送此消息给editcontrol或combobox从剪贴板中得到数据
  public const int wm_clear = 0x0303;      //程序发送此消息给editcontrol或combobox清除当前选择的内容;
  public const int wm_undo = 0x0304;        //程序发送此消息给editcontrol或combobox撤消最后一次操作

  public textboxnumex()
  {
   //
   // todo: 在此处添加构造函数逻辑
   //
  }
  protected override void wndproc(ref message m)
  {
   switch(m.msg)
   {
    case wm_char:
     system.console.writeline(m.wparam);
     bool issign = ((int)m.wparam == 45);
     bool isnum = ((int)m.wparam >= 48) && ((int)m.wparam <= 57);
     bool isback = (int)m.wparam == (int)keys.back;
     bool isdelete = (int)m.wparam == (int)keys.delete;//实际上这是一个"."键
     bool isctr = ((int)m.wparam == 24) || ((int)m.wparam == 22) || ((int)m.wparam == 26) ||((int)m.wparam == 3);

     if( isnum || isback || isctr)
     {
      base.wndproc (ref m);
     }
     if (issign)
     {
      if (this.selectionstart!=0)
      {
       break;
      }
      base.wndproc (ref m);
      break;
     }
     if (isdelete)
     {
      if (this.text.indexof(".")<0)
      {
       base.wndproc (ref m);
      }
     }
     if ((int)m.wparam == 1)
     {
      this.selectall();
     }
     break;
    case wm_paste:
     idataobject idata = clipboard.getdataobject();//取剪贴板对象
     
     if(idata.getdatapresent(dataformats.text)) //判断是否是text
     {
      string str = (string)idata.getdata(dataformats.text);//取数据
      if (matchnumber(str))
      {
       base.wndproc (ref m);
       break;
      }
     }
     m.result = (intptr)0;//不可以粘贴
     break;
    default:
     base.wndproc (ref m);
     break;
   }
  }
  private bool matchnumber(string clipboardtext)
  {
   int index=0;
   string strnum = "-0.123456789";

   index = clipboardtext.indexof(strnum[0]);
   if (index>=0)
   {
    if (index>0)
    {
     return false;
    }
    index = this.selectionstart;

本文关键:只能对数值操作的TextBox
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top