CSkin博客

标题: 【C#TextBox输入时间】TextBox只能输入时间 [打印本页]

作者: Blue_Pen    时间: 2015-7-15 16:03
标题: 【C#TextBox输入时间】TextBox只能输入时间
BinGoo教学之《TextBox只能输入时间》
简介:
利用TextBox制作时间输入框

说明:
虽然系统有一个MaskedTextBox,但是感觉不太好用,今天给你们的教学是利用TextBox的KeyPress事件来限制输入时间格式的文本。类似于DateTimePicker的手动输入时间样式。

效果截图:
1.这里显示的效果如下图所示

2.整体运行效果如下GIF动画所示
教程代码:
[C#] 纯文本查看 复制代码
        private void txtPrice_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (dtCell == null)
            {
                return;
            }
            string oldtxt = textBox1.Text;
            if (oldtxt.Length > 5)
            {
                e.Handled = true;
            }
            int cursorPos = textBox1.SelectionStart;
            if (cursorPos == 2)
            {
                cursorPos = 3;
            }
            System.Text.RegularExpressions.Match match;
            switch (cursorPos)
            {
                case 0:
                    if (e.KeyChar.ToString() == "2")
                    {
                        if(int.Parse(oldtxt.Substring(1, 1))> 3)
                        {
                            //小时最大是24小时,输入的小时单位上十位的数字如果是2,那么小时单位上个位的数字不能大于3,默认变成0
                            oldtxt = oldtxt.Substring(0, 1) + "0" + oldtxt.Substring(2, oldtxt.Length - 2);
                        }
                    }
                    match = System.Text.RegularExpressions.Regex.Match(e.KeyChar.ToString(), "[0-2]");
                    break;
                case 1:
                    if (oldtxt.Substring(0, 1) != "2")
                    {
                        //小时最大是24小时,如果小时单位上十位的数字不是2,那么小时单位上个位的数字可以为0~9
                        match = System.Text.RegularExpressions.Regex.Match(e.KeyChar.ToString(), "[0-9]");
                    }
                    else
                    {
                        //小时最大是24小时,如果小时单位上十位的数字是2,那么小时单位上个位的数字可以为0~3
                        match = System.Text.RegularExpressions.Regex.Match(e.KeyChar.ToString(), "[0-3]");
                    }
                    
                    break;
                case 3:
                    //分钟最大是59分钟,所以分钟单位上十位的数字只能是0~5
                    match = System.Text.RegularExpressions.Regex.Match(e.KeyChar.ToString(), "[0-5]");
                    break;
                case 4:
                    //分钟最大是59分钟,所以分钟单位上个位的数字只能是0~9
                    match = System.Text.RegularExpressions.Regex.Match(e.KeyChar.ToString(), "[0-9]");
                    break;
                default:
                    match = System.Text.RegularExpressions.Regex.Match("x", "[0-2]");
                    break;
            }
            if (match.Success)
            {
                string s = oldtxt.Substring(0, cursorPos) + e.KeyChar.ToString() +
                    oldtxt.Substring(cursorPos + 1, oldtxt.Length - cursorPos - 1);
                dtCell.Text = s;
                textBox1.Text = s;
                //如果光标在小时的个位的位置上则直接跳到分钟十位的位置上
                textBox1.Select(cursorPos + (cursorPos!=1?1:2), 1);
            }
            e.Handled = true;
           
        }

作者: 乔克斯    时间: 2015-7-15 17:26
来踩踩。
作者: 忧郁之子    时间: 2015-7-16 22:10
看着不错,支持了。
作者: 成信之子    时间: 2015-8-9 12:05
谢谢分享。。。。。。。。
作者: Edward    时间: 2015-8-16 21:49
谢谢分享!!!
作者: 王者VIP    时间: 2015-9-28 09:04
这个太好了
作者: seling    时间: 2015-10-21 13:05

楼主辛苦了  学习了


作者: Even    时间: 2015-12-5 11:09
讚哦 參考一下
作者: zjwzcx    时间: 2016-1-25 10:37
看着不错,支持了。
作者: JJboon    时间: 2016-5-18 07:58
这个可以套用在IP输入
作者: jackdown    时间: 2017-8-30 23:21
支持,谢谢楼主分享。
作者: livehu5188    时间: 2017-10-30 00:57
谢谢分享 真好人
作者: rocker2001    时间: 2019-1-11 18:35
#在这里快速回复#感谢分享,LZ辛苦了~
作者: jackdown    时间: 2019-2-15 16:53
谢谢分享,看看。
作者: jackdown    时间: 2019-2-15 16:53
谢谢分享,看看。
作者: still2012    时间: 2019-2-17 09:05
很实用,能不能把文本格式(00:00)的代码也给出来?
作者: n091912    时间: 2019-4-4 00:26
感谢分享,LZ辛苦了~




欢迎光临 CSkin博客 (http://bbs.cskin.net/) Powered by Discuz! X3.2