winform创建控件,要求可以手动输入日期DatePicker

要求:文本框中能手动输入数字,向上箭头根据鼠标位置给年月日递增,向下箭头递减

一:页面加载时:

private void FlatDatePicker_Load(object sender, EventArgs e)
{
    txtMain.Text = DateTime.Now.ToString("MM/dd/yyyy");
    txtMain.Location = new Point(10,19);
    txtMain.Width = 150;
    btnUp.Width = 20;
    btnUp.Height = txtMain.Height / 2;
    btnDown.Width = 20;
    btnDown.Height = txtMain.Height / 2;
    this.Width = txtMain.Width + 20;
    this.Height = txtMain.Height;
    btnUp.Location = new Point(txtMain.Width, 0);
    btnDown.Location = new Point(txtMain.Width, btnUp.Height);
}

二、按下Delete键时不允许删除"/"

private void txtMain_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        //不允许Delete键删除‘/‘
        case Keys.Delete:
            int selectIndex = txtMain.SelectionStart;
            int selectLength = txtMain.SelectionLength;
            int xiegangIndex1 = txtMain.Text.IndexOf(‘/‘);
            int xiegangIndex2 = txtMain.Text.LastIndexOf(‘/‘);
            bool condition1 = selectLength == 0 && (selectIndex == xiegangIndex1 || selectIndex == xiegangIndex2);
            bool condition2 = selectLength > 0 && txtMain.Text.Substring(selectIndex, selectLength).Contains("/");
            if (condition1 || condition2)
            {
                e.Handled = true;
            }
            break;
        default:
            break;
    }
}

三、按下键时排除不合适字符

private void txtMain_KeyPress(object sender, KeyPressEventArgs e)
{
    #region 不合适字符
    if (!Char.IsNumber(e.KeyChar) && !Char.IsPunctuation(e.KeyChar) && !Char.IsControl(e.KeyChar))
    {
        e.Handled = true;//消除不合适字符
    }
    else if (Char.IsPunctuation(e.KeyChar))
    {
        if (e.KeyChar != ‘.‘ || this.Text.Length == 0)//小数点
        {
            e.Handled = true;
        }
        if (this.Text.LastIndexOf(‘.‘) != -1)
        {
            e.Handled = true;
        }
    }
    else if (txtMain.Text == "")
    {
        e.Handled = true;
    }
    #endregion
    #region 按下数字键 数字超过指定的年月日则无效
    if (Char.IsNumber(e.KeyChar))//按下数字键
    {
        int selectedIndex = txtMain.SelectionStart;
        int selectedLength = txtMain.SelectionLength;
        int monthLength = txtMain.Text.Split(‘/‘)[0].Length;
        int dayLength = txtMain.Text.Split(‘/‘)[1].Length;
        int yearLength = txtMain.Text.Split(‘/‘)[2].Length;
        int monthIndex = txtMain.Text.IndexOf(‘/‘, 0, 3);
        int dayIndex = txtMain.Text.IndexOf(‘/‘, 3);

        int month = DateTime.Now.Month;
        int day = DateTime.Now.Day;
        int year = DateTime.Now.Year;
        if (txtMain.SelectedText.Contains("/"))
        {
            e.Handled = true;
        }
        else if (selectedIndex <= monthIndex)
        {//修改月份
            #region 修改月份
            if (selectedIndex == 0)
            {
                if (selectedLength == 0)
                {
                    if (monthLength == 1)
                    {
                        int.TryParse(e.KeyChar.ToString() + txtMain.Text.Substring(0, 1), out month);
                    }
                    else if (monthLength == 2)
                    {
                        e.Handled = true;
                    }
                }
                else if (selectedLength == 1)
                {
                    if (monthLength == 1)
                    {
                        int.TryParse(e.KeyChar.ToString(), out month);
                    }
                    else if (monthLength == 2)
                    {
                        int.TryParse(e.KeyChar.ToString() + txtMain.Text.Substring(1, 1), out month);
                    }
                }
                else if (selectedLength == 2)
                {
                    int.TryParse(e.KeyChar.ToString(), out month);
                }
            }
            else if (selectedIndex == 1)
            {
                if (selectedLength == 0)
                {
                    if (monthLength == 1)
                    {
                        int.TryParse(txtMain.Text.Substring(0, 1) + e.KeyChar.ToString(), out month);
                    }
                    else if (monthLength == 2)
                    {
                        e.Handled = true;
                    }
                }
                else if (selectedLength == 1)
                {
                    int.TryParse(txtMain.Text.Substring(0, 1) + e.KeyChar.ToString(), out month);
                }
            }
            else if (selectedIndex == 2)
            {
                e.Handled = true;
            }

            if (month <= 0 || month >= 13)
            {
                e.Handled = true;
            }
            #endregion
        }
        else if (selectedIndex <= dayIndex)
        {//修改日期
            #region 修改日期
            if (selectedIndex == 3)
            {
                if (selectedLength == 0)
                {
                    if (dayLength == 1)
                    {
                        int.TryParse(e.KeyChar.ToString() + txtMain.Text.Substring(3, 1), out day);
                    }
                    else if (dayLength == 2)
                    {
                        e.Handled = true;
                    }
                }
                else if (selectedLength == 1)
                {
                    if (dayLength == 1)
                    {
                        int.TryParse(e.KeyChar.ToString(), out day);
                    }
                    else if (dayLength == 2)
                    {
                        int.TryParse(e.KeyChar.ToString() + txtMain.Text.Substring(4, 1), out day);
                    }
                }
                else if (selectedLength == 2)
                {
                    int.TryParse(e.KeyChar.ToString(), out day);
                }
            }
            else if (selectedIndex == 4)
            {
                if (selectedLength == 0)
                {
                    if (dayLength == 1)
                    {
                        int.TryParse(txtMain.Text.Substring(3, 1) + e.KeyChar.ToString(), out day);
                    }
                    else if (dayLength == 2)
                    {
                        e.Handled = true;
                    }
                }
                else if (selectedLength == 1)
                {
                    int.TryParse(txtMain.Text.Substring(3, 1) + e.KeyChar.ToString(), out day);
                }
            }
            else if (selectedIndex == 5)
            {
                e.Handled = true;
            }

            int.TryParse(txtMain.Text.Split(‘/‘)[0], out month);
            int.TryParse(txtMain.Text.Split(‘/‘)[2], out year);
            if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day > 31)
            {
                e.Handled = true;
            }
            else if ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30)
            {
                e.Handled = true;
            }
            if (DateTime.IsLeapYear(year) && month == 2 && day > 29)
            {
                e.Handled = true;
            }
            else if (!DateTime.IsLeapYear(year) && month == 2 && day > 28)
            {
                e.Handled = true;
            }
            #endregion
        }
        else
        {//修改年份
            #region 修改年份
            if (yearLength == 3)
            {
                int.TryParse(txtMain.Text.Substring(6, 3) + e.KeyChar.ToString(), out year);
                if (year < 1900)
                {
                    e.Handled = true;
                    //txtMain.Text = txtMain.Text.Split(‘/‘)[0] + "/" + txtMain.Text.Split(‘/‘)[1] + "/" + DateTime.Now.Year;
                }
            }
            else if (yearLength > 3 && selectedLength <= 0)
            {
                e.Handled = true;
            }
            #endregion
        }
    }
    #endregion
    #region 按下BackSpcae键 不允许删除"/"
    if (e.KeyChar == ‘\b‘)
    {
        int selectIndex = txtMain.SelectionStart;
        int selectlength = txtMain.SelectionLength;
        if (selectlength == 0 && selectIndex > 0)
        {
            string delStr = txtMain.Text.Substring(selectIndex - 1, 1);
            if (delStr == "/")
            {
                e.Handled = true;
            }
        }
        if (selectlength > 0)
        {
            string delStr = txtMain.Text.Substring(selectIndex, selectlength);
            if (delStr.Contains("/"))
            {
                e.Handled = true;
            }
        }
    }
    #endregion
}

四、

private void txtMain_KeyUp(object sender, KeyEventArgs e)
{
    int selectIndex = txtMain.SelectionStart;
    int month = 0;
    int.TryParse(txtMain.Text.Split(‘/‘)[0], out month);
    int day = 0;
    int.TryParse(txtMain.Text.Split(‘/‘)[1], out day);
    int year = 0;
    int.TryParse(txtMain.Text.Split(‘/‘)[2], out year);
    int xiegangIndex1 = txtMain.Text.IndexOf(‘/‘);//第一个‘/‘的位置
    int xiegangIndex2 = txtMain.Text.LastIndexOf(‘/‘);//第二个‘/‘的位置
    switch (e.KeyCode)
    {
        #region 松开左右键
        case Keys.Left:
            if (selectIndex <= xiegangIndex1)
            {
                FillDay();
                Fillyear();
            }
            else if (selectIndex <= xiegangIndex2)
            {
                FillMonth();
                Fillyear();
            }
            else
            {
                FillMonth();
                FillDay();
            }
            txtMain.SelectionStart = selectIndex;
            break;
        case Keys.Right:
            if (selectIndex <= xiegangIndex1)
            {
                FillDay();
                Fillyear();
            }
            else if (selectIndex <= xiegangIndex2)
            {
                FillMonth();
                Fillyear();
            }
            else
            {
                FillMonth();
                FillDay();
            }
            break;
        #endregion
        case Keys.End:
            break;
        case Keys.Home:
            break;
        #region 上下键增减年月日
        case Keys.Up:
            selectIndex++;
            if (selectIndex < 3)
            {
                if (month < 12)
                {
                    month++;
                    FillMonth(month);
                }
                txtMain.Select(0, 2);
            }
            else if (selectIndex < 6)
            {
                bool condition1 = (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day < 31;
                bool condition2 = (month == 4 || month == 6 || month == 9 || month == 11) && day < 30;
                bool condition3 = month == 2 && (DateTime.IsLeapYear(year) && day < 29 || !DateTime.IsLeapYear(year) && day < 28);
                if (condition1 || condition2 || condition3)
                {
                    day++;
                    FillDay(day);
                }
                txtMain.Select(3, 2);
            }
            else
            {
                if (year < 9999)
                {
                    year++;
                    Fillyear(year);
                }
                txtMain.Select(6, 4);
            }
            break;
        case Keys.Down:
            selectIndex--;
            if (selectIndex < 3)
            {
                if (month > 1)
                {
                    month--;
                    FillMonth(month);
                }
                txtMain.SelectionStart = 0;
                txtMain.Select(0, 2);
            }
            else if (selectIndex < 6)
            {
                if (day > 1)
                {
                    day--;
                    FillDay(day);
                }
                txtMain.SelectionStart = 3;
                txtMain.Select(3, 2);
            }
            else
            {
                if (year > 1900)
                {
                    year--;
                    Fillyear(year);
                }
                txtMain.SelectionStart = 6;
                txtMain.Select(6, 4);
            }
            break;
        #endregion
        case Keys.Delete:
            break;
        #region 松开数字键
        case Keys.D0:
        case Keys.D1:
        case Keys.D2:
        case Keys.D3:
        case Keys.D4:
        case Keys.D5:
        case Keys.D6:
        case Keys.D7:
        case Keys.D8:
        case Keys.D9:
        case Keys.NumPad0:
        case Keys.NumPad1:
        case Keys.NumPad2:
        case Keys.NumPad3:
        case Keys.NumPad4:
        case Keys.NumPad5:
        case Keys.NumPad6:
        case Keys.NumPad7:
        case Keys.NumPad8:
        case Keys.NumPad9:
            if ((month > 1 || selectIndex > 1) && txtMain.Text.Split(‘/‘)[0].Length < 2 || (selectIndex == 2 && txtMain.Text.Split(‘/‘)[1].Length == 2))
            {
                EidtDay(month);
                FillMonth();
                txtMain.Select(3, 2);
            }

            if ((month == 2 && day > 2 || month != 2 && day > 3 || (selectIndex < 3 || selectIndex > 4)) && txtMain.Text.Split(‘/‘)[1].Length < 2 || (selectIndex == 5 && txtMain.Text.Split(‘/‘)[1].Length == 2))
            {
                FillDay();
                txtMain.Select(6, 4);
            }

            if (selectIndex > 6 && txtMain.Text.Split(‘/‘)[2].Length >= 4)
            {
                EidtDay(month, year);
                Fillyear();
            }
            break;
        #endregion
        default:
            break;
    }
}

五、

private void txtMain_Leave(object sender, EventArgs e)
{
    FillMonth();
    FillDay();
    Fillyear();
}

六、

private void txtMain_MouseDown(object sender, MouseEventArgs e)
{
    FillMonth();
    FillDay();
    Fillyear();
}

七、

private void btnUp_Click(object sender, EventArgs e)
{
    int selectIndex = txtMain.SelectionStart;
    int month = 0;
    int.TryParse(txtMain.Text.Split(‘/‘)[0], out month);
    int day = 0;
    int.TryParse(txtMain.Text.Split(‘/‘)[1], out day);
    int year = 0;
    int.TryParse(txtMain.Text.Split(‘/‘)[2], out year);
    if (selectIndex < 3)
    {
        if (month < 12)
        {
            month++;
            FillMonth(month);
        }
        txtMain.Select();
        txtMain.Select(0, 2);
    }
    else if (3 <= selectIndex && selectIndex < 6)
    {
        bool condition1 = (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day < 31;
        bool condition2 = (month == 4 || month == 6 || month == 9 || month == 11) && day < 30;
        bool condition3 = month == 2 && (DateTime.IsLeapYear(year) && day < 29 || !DateTime.IsLeapYear(year) && day < 28);
        if (condition1 || condition2 || condition3)
        {
            day++;
            FillDay(day);
        }
        txtMain.Select();
        txtMain.Select(3, 2);
    }
    else if (selectIndex >= 6)
    {
        if (year < 9999)
        {
            year++;
            Fillyear(year);
        }
        txtMain.Select();
        txtMain.Select(6, 4);
    }
}
private void btnDown_Click(object sender, EventArgs e)
{
    int selectIndex = txtMain.SelectionStart;
    int month = 0;
    int.TryParse(txtMain.Text.Split(‘/‘)[0], out month);
    int day = 0;
    int.TryParse(txtMain.Text.Split(‘/‘)[1], out day);
    int year = 0;
    int.TryParse(txtMain.Text.Split(‘/‘)[2], out year);
    if (selectIndex < 3)
    {
        if (month > 1)
        {
            month--;
            FillMonth(month);
        }
        txtMain.Select();
        txtMain.Select(0, 2);
    }
    else if (3 <= selectIndex && selectIndex < 6)
    {
        if (day > 1)
        {
            day--;
            FillDay(day);
        }
        txtMain.Select();
        txtMain.Select(3, 2);
    }
    else if (selectIndex >= 6)
    {
        if (year > 1900)
        {
            year--;
            Fillyear(year);
        }
        txtMain.Select();
        txtMain.Select(6, 4);
    }
}

八、

private bool Fillyear(int year = 0)
{
    bool editBool = false;
    if (year == 0)
    {
        int.TryParse(txtMain.Text.Split(‘/‘)[2], out year);
        if (year == 0)
        {
            year = DateTime.Now.Year;
            editBool = true;
        }
    }
    if (year < 1900 && year > 0)
    {
        txtMain.Text = txtMain.Text.Split(‘/‘)[0] + "/" + txtMain.Text.Split(‘/‘)[1] + "/" + DateTime.Now.Year;
        editBool = true;
    }
    else
    {
        txtMain.Text = txtMain.Text.Split(‘/‘)[0] + "/" + txtMain.Text.Split(‘/‘)[1] + "/" + year;
        editBool = true;
    }
    return editBool;
    //txtMain.Select(0, 2);
}

private bool FillMonth(int month = 0)
{
    bool editBool = false;
    if (month == 0)
    {
        int.TryParse(txtMain.Text.Split(‘/‘)[0], out month);//txtMain.Text.Substring(0, 2)
        if (month == 0)
        {
            month = DateTime.Now.Month;
            editBool = true;
        }
    }
    if (9 >= month && month > 0)
    {
        txtMain.Text = "0" + month.ToString() + "/" + txtMain.Text.Split(‘/‘)[1] + "/" + txtMain.Text.Split(‘/‘)[2];
        editBool = true;
    }
    else
    {
        txtMain.Text = month + "/" + txtMain.Text.Split(‘/‘)[1] + "/" + txtMain.Text.Split(‘/‘)[2];
        editBool = true;
    }
    return editBool;
    //txtMain.Select(3, 2);
}

private bool FillDay(int day = 0)
{
    bool editBool = false;
    if (day == 0)
    {
        int.TryParse(txtMain.Text.Split(‘/‘)[1], out day);//txtMain.Text.Substring(0, 2)
        if (day == 0)
        {
            day = DateTime.Now.Day;
            editBool = true;
        }
    }
    if (9 >= day && day > 0)
    {
        txtMain.Text = txtMain.Text.Split(‘/‘)[0] + "/" + "0" + day.ToString() + "/" + txtMain.Text.Split(‘/‘)[2];
        editBool = true;
    }
    else
    {
        txtMain.Text = txtMain.Text.Split(‘/‘)[0] + "/" + day.ToString() + "/" + txtMain.Text.Split(‘/‘)[2];
        editBool = true;
    }
    return editBool;
    //txtMain.Select(6, 4);
}

九、

/// <summary>
/// 根据年月判断日期是否超出范围 是则修改
/// </summary>
private void EidtDay(int month = 0, int year = 0)
{
    if (month == 0)
    {
        int.TryParse(txtMain.Text.Split(‘/‘)[0], out month);
    }
    int day = 0;
    int.TryParse(txtMain.Text.Split(‘/‘)[1], out day);
    if (year == 0)
    {
        int.TryParse(txtMain.Text.Split(‘/‘)[2], out year);
    }
    if (month == 0)
    {
        month = DateTime.Now.Month;
    }
    if (day == 0)
    {
        day = DateTime.Now.Day;
    }
    if (year == 0)
    {
        year = DateTime.Now.Year;
    }
    if ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30)
    {
        if (month < 11)
        {
            txtMain.Text = "0" + month + "/30/" + year;
        }     else     {        txtMain.Text = month + "/30/" + year;     }    }
   if (DateTime.IsLeapYear(year) && month == 2 && day > 29)
    {
        txtMain.Text = "0" + month + "/29/" + year;
    }
    if (!DateTime.IsLeapYear(year) && month == 2 && day > 28)
    {
        txtMain.Text = "0" + month + "/28/" + year;
    }
}
时间: 2024-11-09 09:10:15

winform创建控件,要求可以手动输入日期DatePicker的相关文章

[Winform]线程间操作无效,从不是创建控件的线程访问它的几个解决方案,async和await?

目录 概述 取消跨线程检查 使用委托异步调用 sync和await 总结 概述 最近在qq群里有一朋友,问起在winform中怎么通过开启线程的方式去处理耗时的操作,比如,查看某个目录下所有的文件,或者符合要求的文件.下班回来,也研究了一下.发现多线程这块有点薄弱,也算是补一补吧. 在winform开发,经常会遇到需要在控件上加载大量数据(也就是常说的耗时操作),这会导致程序出现假死状态,这个时候我们就会想到线程. 在智能客户端应用程序中,这样的线程创建并管理用户界面 (UI),因而称为 UI

在C# WinForm程序中创建控件数组及相应的事件处理

控件数组是VB提供的一个优秀的设计解决方案,它能很方便快捷的处理大批同类控件的响应和时间处理,但不知为什么在C#中这个优秀特性没有传承下来,甚为可惜,本文将要探讨就是如何在C# WinForm程序实现它.首先请看界面 在上面的界面中,本人想实现一个42个元素的Button数组来实现一个日历的功能,上面显示出了一部分. 其中采用了网格布局来放置这些按钮.手工创建为全部按钮后,在窗体类中代码中定义成员变量控件数组: private Button[] btns;然后在构造函数中初始化: btns =

类似web风格的 Winform 分页控件

背景 最近做一个Winform的小程序,需要用到分页,由于之前一直在用 TonyPagerForWinForm.dll ,但该库没有源代码,网上找的也不全面,索性就准备自己改造一个.在园子里翻了一下,发现路过秋天在多年前写了个分页控件,Winform 通用分页控件实战篇(提供源码下载).站在大神的肩膀上就是快,一会就改好了. 效果图 功能比较齐全,不过样式上,楼主十分喜欢easyUI或ext的列表分页风格.于是换了几个按钮,添加了图标,看看现在的效果. 控件源码在正文最下方. 使用简介 就那么一

在DevExpress程序中使用Winform分页控件直接录入数据并保存

一般情况下,我们都倾向于使用一个组织比较好的独立界面来录入或者展示相关的数据,这样处理比较规范,也方便显示比较复杂的数据.不过在一些情况下,我们也可能需要直接在GridView表格上直接录入或者修改数据,这种对于字段比较少,而且内容相对比较简单的情况下,效率是比较高的一种输入方式.本篇随笔主要介绍在DevExpress程序中使用GridView直接录入数据并保存的实现,以及使用Winform分页控件来进行数据直接录入的实现操作. 1.在GridView上展示数据 在GridView上展示数据,只

线程间操作无效: 从不是创建控件“button1”的线程访问它。

.net2后是不能跨线程访问控件的.,窗体上的控件是当前主线程创建的,当用户异步执行一个方法:在该方法中给窗体上的控件赋值,记住:当执行一个异步委托的时候,其实 就是开了一个线程去执行那个方法,这样就会报错:线程间操作无效: 从不是创建控件“某某某”的线程访问它. C# WinForm开 发中,这是一个比较常见的异常:线程间操作无效,从不是创建控件“xxx”的线程访问它.这个异常来源于.NET2的一个限制:工作线程不能访问窗口线程 创建的控件.解决方法主要有两种,一种是在窗口线程中设置Check

C#报错&quot;线程间操作无效: 从不是创建控件“XXX”的线程访问它&quot;--解决示例

C# Winform程序中,使用线程对界面进行更新需要特殊处理,否则会出现异常“线程间操作无效: 从不是创建控件“taskView”的线程访问它.” 在网文“http://www.cnblogs.com/smileberry/p/3912918.html”的知道下,我做了下面的例程,希望对大家有所帮助,如果注释不够的话请访问原文. 例程是点击按钮后启动线程更新一个标签的文字,界面如下: 程序如下: using System; using System.Collections.Generic; u

关于“线程间操作无效: 从不是创建控件’textBox1‘的线程访问它”异常的解决方法

线程间操作无效: 从不是创建控件“textBox1”的线程访问它 背景:通过一个辅助线程计算出的一个值赋给textBox1.text;解决办法:1.直接在窗体的构造函数中加:System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; 此时把所有的控件 合法性线程检查全部都给禁止掉了. 2.通过代理来解决(msdn) private delegate void SetTextCallback(string text);

026-代码创建控件-iOS笔记

学习目标 1.[理解]代码创建控件过程 2.[理解]代码实现QQ登陆界面 3.[理解]图片浏览器 4.[理解]汤姆猫小游戏 一.代码创建控件过程 所有控件都是类的对象,不同的类创建可以不同类型的控件.也是就说创建一个控件其实就是创建一个对应类的对象. 常用控件类型 UIButton:按钮,界面上可点击的大都是按钮 UILabel:标签,界面上只显示文字不能点击大都是标签 UITextField:文本框,界面上可输入数据的文本框 UIImageView:图片框,界面上不可点击的图片大都是图片框 使

线程间操作无效: 从不是创建控件“控件id”的线程访问它。(.net跨线程执行方法)

找了好久资料,终于解决了,特此记录下来. 1 delegate void DelListHandler(string number); /// <summary> /// 按标识删除listview内容 /// </summary> /// <param name="number">标识</param> private void DelListViewLog(string number) { for (int i = 0; i <