只能输入数字的方法小集

来源:互联网 发布:自己淘宝退货率怎么看 编辑:程序博客网 时间:2024/05/21 22:41

 方法一:

自已尝试过很多次﹐每次都不是很理想﹐现在尝试将其做成一个用户控件﹐与大家分享﹐同时希望大家能提供出更好的方法﹒

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];
        }