内容显示页
 
类别:.Net + C# | 浏览(2945) | 2009-5-13 12:15:03

TextBox控件重写 之NumTextBox,主要实现的功能是,只允许输入数字,或String,Numeric,Currency,Decimal,Float,Double,Short,Int,Long

等加了一个属性InputType可以设置其,还可以自己进一步扩展,因为是开源的。

        public enum NumTextBoxType
        {
            String,//是这个的时候,什么都不处理,跟正常TextBox一样
            Numeric,//只要是数字就行
            Currency,
            Decimal,
            Float,
            Double,
            Short,
            Int,
            Long
        }

主要代码:

using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace YongFa365.Controls.NumTextBox
{
    public class NumTextBox : TextBox
    {
        private NumTextBoxType inputType = NumTextBoxType.Numeric;
        public enum NumTextBoxType
        {
            String,//是这个的时候,什么都不处理,跟正常TextBox一样
            Numeric,//只要是数字就行
            Currency,
            Decimal,
            Float,
            Double,
            Short,
            Int,
            Long
        }

        public NumTextBox()
        {
            this.ContextMenu = new ContextMenu();
        }

        [
        Category("专用设置"),
        DefaultValue(NumTextBoxType.Numeric),
        Description("设置允许类型:\nString跟普通TextBox功能一样\nNumeric只要是数字就可以")
        ]
        public NumTextBoxType InputType
        {
            get { return inputType; }
            set { inputType = value; }
        }

        public override string Text
        {
            get { return base.Text; }
            set
            {
                if (IsValid(value, true))
                {
                    base.Text = value;
                }
            }
        }

        private bool IsValid(string val, bool use)
        {
            bool ret = true;

            if (string.IsNullOrEmpty(val))
            {
                return ret;
            }

            if (use)
            {
                if (val.Equals("-") && inputType != NumTextBoxType.Numeric)
                {
                    return ret;
                }
            }


            try
            {
                switch (inputType)
                {
                    case NumTextBoxType.String:
                        break;
                    case NumTextBoxType.Numeric:
                        if (!Regex.IsMatch(val, @"^\d*$"))
                        {
                            ret = false;
                        }
                        break;
                    case NumTextBoxType.Currency:
                        decimal dec = decimal.Parse(val);
                        int pos = val.IndexOf(".");
                        if (pos != -1)
                        {
                            ret = val.Substring(pos).Length <= 3;
                        }
                        break;
                    case NumTextBoxType.Float:
                        float flt = float.Parse(val);
                        break;
                    case NumTextBoxType.Double:
                        double dbl = double.Parse(val);
                        break;
                    case NumTextBoxType.Decimal:
                        decimal dec2 = decimal.Parse(val);
                        break;
                    case NumTextBoxType.Short:
                        short s = short.Parse(val);
                        break;
                    case NumTextBoxType.Int:
                        int i = int.Parse(val);
                        break;
                    case NumTextBoxType.Long:
                        long l = long.Parse(val);
                        break;
                    default:
                        throw new ApplicationException();
                }
            }
            catch
            {
                ret = false;
            }
            return ret;
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {

            if (keyData == (Keys)Shortcut.CtrlV || keyData == (Keys)Shortcut.ShiftIns)
            {
                IDataObject iData = Clipboard.GetDataObject();


                string newText;
                newText = base.Text.Substring(0, base.SelectionStart)
                    + (string)iData.GetData(DataFormats.Text)
                    + base.Text.Substring(base.SelectionStart + base.SelectionLength);

                if (!IsValid(newText, true))
                {
                    return true;
                }
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

        protected override void OnLeave(EventArgs e)
        {
            if (!(inputType == NumTextBoxType.Numeric || inputType == NumTextBoxType.String))
            {
                if (base.Text != "")
                {
                    if (!IsValid(base.Text, false))
                    {
                        base.Text = "";
                    }
                    else if (Double.Parse(base.Text) == 0)
                    {
                        base.Text = "0";
                    }
                }

            }
            base.OnLeave(e);

        }

        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (inputType != NumTextBoxType.String)
            {
                char c = e.KeyChar;
                if (!Char.IsControl(c))
                {
                    if (c.ToString() == " ")
                    {
                        e.Handled = true;
                        return;
                    }

                    string newText = base.Text.Substring(0, base.SelectionStart)
                        + c.ToString() + base.Text.Substring(base.SelectionStart + base.SelectionLength);

                    if (!IsValid(newText, true))
                    {
                        e.Handled = true;
                    }
                }
            }
            base.OnKeyPress(e);
        }
    }
}

演示及组件下载地址:NumTextBox.rar

柳永法(yongfa365)'Blog转载,修改自:http://www.codeproject.com/KB/edit/numedit.aspx


引用本页地址:http://www.yongfa365.com/item/NumTextBox.html
 
 
相关链接
 
网友评论:
姓名: 记住我
网址:
邮箱:
内容:
验证码:  验证码图片 看不清? 换张图试试
 
     
 
 
文章分类
 
 
.Net + C#(73)
 
 
ASP+VBS(161)
 
 
 
Linux(10)
 
 
 
web 2.0(26)
 
 
 
 
 
心程(68)
 
生活(97)
 
 
     

Power by :柳永法(yongfa365)'Blog  | 京ICP备07011491号  QQ:64049027  E-mail:64049027@qq.com yongfa365'CodePlex yongfa365'CodeGoogle

申请友情链接 要求:跟本站主题相类似正规网站,双方交换为首页位置

转载请注明来源,以便后人及时得到最新、修正、加强版!!!