方法一:
自已尝试过很多次﹐每次都不是很理想﹐现在尝试将其做成一个用户控件﹐与大家分享﹐同时希望大家能提供出更好的方法﹒
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
namespace WinERP
{
public partial class UC_DecimalTextBox : UserControl
{
private int intLength = 3; // 整数部份的长度
private int decimalLength = 2; // 保留小数的位数
private ErrorProvider errorProvider; // 用于显示错误信息的ErrorProvider控件
[Description("设置整数部份的长度(在1~100之间)")]
public int IntLength
{
get { return intLength; }
set
{
try
{
if (value < 1)
{
intLength = 1;
throw new Exception("整数部份的长序必须是1~100之间");
}
else if (value > 100)
{
intLength = 100;
throw new Exception("整数部份的长序必须是1~100之间");
}
else
{
intLength = value;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (decimalLength == 0)
{
textBox1.MaxLength = IntLength;
}
else
{
textBox1.MaxLength = intLength + decimalLength + 1;
}
}
}
}
[Description("设置小数部份的长度(在0~10之间)")]
public int DecimalLength
{
get { return decimalLength; }
set
{
try
{
if (value < 0)
{
decimalLength = 0;
throw new Exception("小数部份的长序必须0~10之间");
}
else if (value > 10)
{
decimalLength = 10;
throw new Exception("小数部份的长序必须0~10之间");
}
else
{
decimalLength = value;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (decimalLength == 0)
{
textBox1.MaxLength = IntLength;
}
else
{
textBox1.MaxLength = intLength + decimalLength + 1;
}
}
}
}
[Description("用于显示错误信息的ErrorProvider控件")]
public ErrorProvider ErrorProvider
{
get { return errorProvider; }
set { errorProvider = value; }
}
[Description("文本框的边框样式")]
public BorderStyle TextBoxBorderStyle
{
get { return textBox1.BorderStyle; }
set { textBox1.BorderStyle = value; }
}
[Description("表示如何对齐TextBox控件中的文字")]
public HorizontalAlignment TextAlign
{
get { return textBox1.TextAlign; }
set { textBox1.TextAlign = value; }
}
[Description("控制是否可以编辑TextBox中的文字")]
public bool ReadOnly
{
get { return textBox1.ReadOnly; }
set { textBox1.ReadOnly = value; }
}
[Description("文本框中的文字")]
public override string Text
{
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
public UC_DecimalTextBox()
{
InitializeComponent();
}
// 当控件调整大小时发生
private void UC_DecimalTextBox_Resize(object sender, EventArgs e)
{
textBox1.Width = this.Width - 6;
this.Height = textBox1.Height + 6; // 固定自定义控件的高﹐不允许调大
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if ((e.KeyChar >= '0' && e.KeyChar <= '9') || (e.KeyChar == '/b') || (e.KeyChar == '.'))
{
e.Handled = false; // 允许输入
int pos = textBox1.SelectionStart;
int intLength = textBox1.Text.Length;
if ((intLength == textBox1.MaxLength) && (pos < textBox1.MaxLength))
{
textBox1.SelectionLength = 1;
if ((textBox1.SelectedText == ".") && (e.KeyChar != '.'))
{
++textBox1.SelectionStart;
}
}
if ((e.KeyChar == '.') && (textBox1.Text.IndexOf('.') > -1))
{
e.Handled = true;
if ((pos < IntLength - 1) && (textBox1.Text.Substring(pos, 1) == "."))
{
textBox1.SelectionStart = ++pos;
}
}
if ((decimalLength == 0) && (e.KeyChar == '.')) // 如果是保留零位小数﹐则不允许输入点号
{
e.Handled = true;
}
}
else
{
e.Handled = true; // 不允许输入
}
}
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
int pos = textBox1.SelectionStart;
string strValue = textBox1.Text.Trim();
if (decimalLength == 0)
{ // 当文本框中只输入整数时
while (strValue.Substring(0, 1) == "0")
{ // 去除整数部份最前右侧的
if (strValue.Length > 1)
{
strValue = strValue.Substring(1, strValue.Length - 1);
if (pos > 0)
{
--pos;
}
}
else
{
break;
}
}
textBox1.Text = strValue;
}
else
{ // 当文本框用于输入小数时
int pointPs = strValue.IndexOf('.');
if (pointPs < 0)
{
strValue += ".".PadRight(DecimalLength, '0');
}
if (pointPs == 0)
{
strValue = "0" + strValue;
textBox1.SelectionStart = ++pos;
}
// 自动使其保留两位小数
string[] strs = strValue.Split(new char[] { '.' });
strs[0] = strs[0].Length > 0 ? strs[0] : "0";
// 去除整数部份最前右侧的
while (strs[0].Substring(0, 1) == "0")
{
if (strs[0].Length > 1)
{
strs[0] = strs[0].Substring(1, strs[0].Length - 1);
if (pos > 0)
{
--pos;
}
}
else
{
break;
}
}
// 取得小数字数的数字,如果不足小数字长度﹐则以填补
if (strs[1].Length < decimalLength)
{
strs[1] = strs[1].PadRight(decimalLength, '0');
}
textBox1.Text = strs[0] + "." + strs[1];
}
textBox1.SelectionStart = pos;
}
private void textBox1_Validating(object sender, CancelEventArgs e)
{
if (errorProvider == null)
{
return;
}
errorProvider.SetError(this, "");
double dValue;
if (!double.TryParse(textBox1.Text, out dValue))
{
string strMsg = string.Format("请输入整数部份不超过{0}位﹐且小数字不超过{1}位的有效数字!", IntLength, decimalLength);
if (decimalLength == 0)
{
strMsg = string.Format("请输入不超过{0}位的有效整数!", IntLength);
}
errorProvider.SetError(this, strMsg);
e.Cancel = true;
}
}
}
}
方法二:
关于用TextBox来验证数据的有效性(只允许输入带两位小数的数字)
在维护界面中,常常需要对在TextBox中输入的数据进行验证,以保证其有效性,
以前自己也有在论坛中发表过,这次做了些小的改进,不过感觉还是有些繁锁,然与大家一起讨论类似问题.
如下例,是一个保确只输入带两位小数的数字,如果配合设置其TextBox控件的MaxLength属性,可以控制该数值的大小.
注: tbPartsCost为一个TextBox控件.tbPartsCost_KeyPress和tbPartsCost_Validating分别是该控件的KeyPress事件和Validating事件.
private void tbPartsCost_KeyPress(object sender, KeyPressEventArgs e)
{
TextBox tb = (TextBox)sender;
int curPos = tb.SelectionStart; // 當前光標位置
int pointPos = tb.Text.LastIndexOf('.'); // 小數點的位置
if ((pointPos > 0) && (curPos > (pointPos + 2))) // 輸入超過兩位小數﹐
{
e.Handled = true;
return;
}
string strInt = tb.Text.Trim().Substring(0, curPos);
string strDec= "";
if(pointPos <0)
{
strDec = ".00";
}
else
{
strDec = tb.Text.Trim().Substring(pointPos);
if (strDec.Length > 3)
{
strDec = strDec.Substring(0, 3);
}
else
{
strDec = strDec.PadRight(3, '0');
}
}
if ((e.KeyChar < '0' || e.KeyChar > '9') && (e.KeyChar != '.') && (e.KeyChar != '/b'))
{ // 如果用戶輸入的不是字符~9﹐也不是刪除鍵和小數點﹐則不顯示﹐
e.Handled = true; // 不允許輸入
}
else if (e.KeyChar == '.')
{
e.Handled = true;
if (strInt.Length == 0)
{
strInt = "0";
}
tb.Text = strInt + strDec;
tb.SelectionStart = ++curPos;
}
else
{
e.Handled = false;
if (curPos > pointPos)
{
tb.SelectionLength = 1;
}
else if (curPos == pointPos)
{
tb.SelectionStart = ++curPos;
SendKeys.Send(e.KeyChar.ToString());
}
if (pointPos < 0)
{
tb.Text = strInt + strDec;
pointPos = tb.Text.LastIndexOf('.'); // 小數點的位置
}
if ((curPos < pointPos) && (tb.Text.Trim().Length == tb.MaxLength))
{
tb.SelectionLength = 1;
}
tb.SelectionStart = curPos;
}
}
private void tbPartsCost_Validating(object sender, CancelEventArgs e)
{
TextBox tb = (TextBox)sender;
string[] strs = tb.Text.Split(new char[] { '.' });
if (strs[0].Trim() == "")
{
strs[0] = "0";
}
strs[0] =int.Parse( strs[0]).ToString().Trim();
if (strs[0].Length > tb.MaxLength - 3)
{
strs[0] = strs[0].Substring(0, tb.MaxLength - 3);
}
strs[1] = strs[1].Trim();
if (strs[1].Length < 2)
{
strs[1] = strs[1].PadRight(2, '0');
}
tb.Text = strs[0] + "." + strs[1];
}