分享
 
 
 

只能对数值操作的TextBox

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體: |||超大  

当界面上要用户输入只有数字的字符时,默认的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;

if (index>0)

{

return false;

}

}

index = ClipboardText.IndexOf(strNum[2]);

if (index!=-1)

{

index = this.Text.IndexOf(strNum[2]);

if (index!=-1)

{

return false;

}

}

for(int i=0; i<ClipboardText.Length; i++)

{

index = strNum.IndexOf(ClipboardText[i]);

if (index <0)

{

return false;

}

}

return true;

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有