贡献个Winform自定义控件,信用卡、银行卡输入控件;每4个字符分隔显示。其他UI框架可以参考。

经常在网银交易的时候需要输入卡号,看到输入的卡号都被每4个字符分隔显示,这样很方便操作者核对。最近在弄WinForm的项目,赶紧也实现一个。要的快来!

 

复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace BarCodeCommon
{
    /// <summary>
    /// 信用卡、银行卡,卡号输入控件;也可以用来输入手机号,4个字符分隔一下。
    /// </summary>
    public partial class BankCardNoInputTextBox : TextBox
    {
        public override string Text
        {
            get
            {
                return base.Text.Replace(" ","");
            }
            set
            {
                base.Text = value;
            }
        }

        public BankCardNoInputTextBox()
        {
            InitializeComponent();
            Font = new Font("幼圆", 10F, FontStyle.Bold);
            ForeColor = Color.DarkBlue;
        }

        protected override void OnTextChanged(EventArgs e)
        {                        
            if (SelectionStart > 4)
            {
                string result = string.Empty;
                var tmpTxt = this.Text.Replace(" ", "").ToArray();
                int cnt = Convert.ToInt32(Math.Ceiling((double)tmpTxt.Length / 4));
                for (int i = 0; i < cnt; i++)
                {
                    var fourChar = tmpTxt.Skip(i * 4).Take(4);
                    result += string.Join("", fourChar) + " ";
                }
                Text = result;
                SelectionStart = result.Length-1;
            }
        }

        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            char c = e.KeyChar;
            //如果是ctrl + c 、ctrl + v、ctrl + x
            if (c.Equals((char)3) || c.Equals((char)22) || c.Equals((char)24))
            {
                return;
            }
            //判断是否是数字
            bool blA = !(c >= 48 && c <= 57) && c != 8 && c != 43 && c != 45 && c != 46;
            //判断是否超过小数点的位数,判断是否会出现数据类型冲突
            bool blC = (c == 43 || c == 45) && (this.Text.IndexOf("+") >= 0 || this.Text.IndexOf("-") >= 0)
                       && this.SelectedText != "+" && this.SelectedText != "-";
            if (blA || blC)
            {
                e.Handled = true;
                return;
            }
        }
    }
}
复制代码

 

posted @   数据酷软件  阅读(2183)  评论(2编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示