36【WinForm】WinForm实现日期计算和日期提醒器

简介: 计算当前日期距离今天之前某个日期之间的时间差。

@TOC


前言


一、计算日期

计算当前日期距离今天之前某个日期之间的时间差。

1、效果

开始运行显示:
在这里插入图片描述

点击图片任意位置:

在这里插入图片描述

2、界面设计

在这里插入图片描述

3、代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 计算日期
{
   
   
    public partial class Form1 : Form
    {
   
   
        public bool isClick = false;
        public Form1()
        {
   
   
            InitializeComponent();

            //toolTip1控件
            toolTip1.ToolTipTitle = "嘿嘿";
            toolTip1.SetToolTip(this.pictureBox1, "徒弟喜欢她就点一下吧!");
        }

        private void Form1_Load(object sender, EventArgs e)
        {
   
   
            //初始化界面大小
            this.Width = 210;
            this.Height = 303;
            this.MaximumSize = new Size(210, 303);

            //计算日期
            int days = (DateTime.Now - DateTime.Parse("2011-12-19")).Days;
            int day=(DateTime.Parse("2012-5-19")-DateTime.Now).Days;
            int hours=(DateTime.Parse("2012-5-19")-DateTime.Now).Hours;
            int minutes=(DateTime.Parse("2012-5-19")-DateTime.Now).Minutes;
            int seconds=(DateTime.Parse("2012-5-19")-DateTime.Now).Seconds;

            label2.Text = DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString();
            label5.Text = days + "天";
            label6.Text = day + "天" + hours + "时" + minutes + "分" + seconds + "秒";
        }

        //定时器每秒中更新日期
        private void timer1_Tick(object sender, EventArgs e)
        {
   
   
            int day = (DateTime.Parse("2012-5-19") - DateTime.Now).Days;
            int hours = (DateTime.Parse("2012-5-19") - DateTime.Now).Hours;
            int minutes = (DateTime.Parse("2012-5-19") - DateTime.Now).Minutes;
            int seconds = (DateTime.Parse("2012-5-19") - DateTime.Now).Seconds;

            label2.Text = DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString();
            label6.Text = day + "天" + hours + "时" + minutes + "分" + seconds + "秒";
        }

        //界面的大小缩放
        private void pictureBox1_Click(object sender, EventArgs e)
        {
   
   
            if (!isClick)
            {
   
   
                isClick = true;
                this.MaximumSize = new Size(609, 303);
                this.Width = 609;
                this.Height = 303;        
            }
            else
            {
   
   
                isClick = false;
                this.Width = 210;
                this.Height = 303;
                this.MaximumSize = new Size(210, 303);
            }
        }
    }
}

二、日期提醒器

1、效果

在这里插入图片描述

2、界面设计

在这里插入图片描述

3、代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace DataReminderCS
{
   
   
    public partial class ReminderForm : Form
    {
   
   
        private Dictionary<DateTime, string> _reminderData = new Dictionary<DateTime, string>();

        public ReminderForm()
        {
   
   
            InitializeComponent();
        }

        /// <summary>
        /// 添加按钮
        /// </summary>
        private void btnAdd_Click(object sender, EventArgs e)
        {
   
   
            _reminderData[mcDate.SelectionStart] = tbDateContent.Text;
            string dateText = mcDate.SelectionStart.ToShortDateString();
            //没有在lvDateList中找到当天的日程安排,则添加。
            if (lvDateList.FindItemWithText(dateText) == null)
                lvDateList.Items.Add(dateText);
        }

        //日期控件选择日期
        private void mcDate_DateSelected(object sender, DateRangeEventArgs e)
        {
   
   
            if (_reminderData.ContainsKey(e.Start))
                tbDateContent.Text = _reminderData[e.Start];
            else
                tbDateContent.Text = string.Empty;
        }

        private void cmsDateList_Opening(object sender, CancelEventArgs e)
        {
   
   
            if (lvDateList.SelectedItems.Count == 0)
            {
   
   
                e.Cancel = true;
            }
        }

        //右键编辑
        private void tsmiEdit_Click(object sender, EventArgs e)
        {
   
   
            mcDate.SelectionStart = DateTime.Parse(this.lvDateList.SelectedItems[0].Text);
            tbDateContent.Text = _reminderData[mcDate.SelectionStart];
        }

        //右键删除
        private void tsmiDelete_Click(object sender, EventArgs e)
        {
   
   
            DateTime dt = DateTime.Parse(this.lvDateList.SelectedItems[0].Text);

            lvDateList.Items.Remove(this.lvDateList.SelectedItems[0]);
            _reminderData.Remove(dt);
            if (mcDate.SelectionStart == dt)
            {
   
   
                tbDateContent.Text = String.Empty;
            }
        }

        /// <summary>
        /// ToolTip提示
        /// </summary>
        private void lvDateList_SelectedIndexChanged(object sender, EventArgs e)
        {
   
   
            if (lvDateList.SelectedItems.Count > 0)
            {
   
   
                ListViewItem currentItem = lvDateList.SelectedItems[0];
                ttDateContent.ToolTipTitle = currentItem.Text;
                Point showPoint = Point.Add(currentItem.Position, new Size(60, 0));
                ttDateContent.Show(_reminderData[DateTime.Parse(currentItem.Text)], lvDateList, showPoint, 5000);
            }
        }

        /// <summary>
        /// 序列化
        /// </summary>
        private void ReminderForm_FormClosing(object sender, FormClosingEventArgs e)
        {
   
   
            if (!cbAutoSave.Checked)
            {
   
   
                return;
            }
            try
            {
   
   
                BinaryFormatter bf = new BinaryFormatter();
                using(FileStream fs=new FileStream("Data.dat",FileMode.Create))
                {
   
   
                    bf.Serialize(fs, _reminderData);
                }
            }
            catch (Exception ex)
            {
   
   
                MessageBox.Show(ex.Message);
            }
        }

        /// <summary>
        /// 反序列化
        /// </summary>
        private void ReminderForm_Load(object sender, EventArgs e)
        {
   
   
            if (File.Exists("Data.dat"))
            {
   
   
                try
                {
   
   
                    BinaryFormatter bf = new BinaryFormatter();
                    using (FileStream fs = new FileStream("Data.dat", FileMode.Open))
                    {
   
   
                         _reminderData = (Dictionary<DateTime, string>)bf.Deserialize(fs);
                    }

                    foreach (DateTime dt in _reminderData.Keys)
                    {
   
   
                        lvDateList.Items.Add(dt.ToShortDateString());
                    }
                    if (_reminderData.ContainsKey(mcDate.SelectionStart))
                    {
   
   
                        tbDateContent.Text = _reminderData[DateTime.Parse(mcDate.SelectionStart.ToShortDateString())];
                    }
                }
                catch (Exception ex)
                {
   
   
                    MessageBox.Show(ex.Message);
                }
            }
        }

        /// <summary>
        /// 验证方法
        /// </summary>
        /// <param name="data">要验证的字符串</param>
        /// <returns></returns>
        private bool ValidateFormat(string data)
        {
   
   
            int timeSplitIndex = data.IndexOf('-');
            int dateSplitIndex = data.IndexOf(' ');

            //如果没有空格或-,则认为格式不合法。
            if (timeSplitIndex == -1 || dateSplitIndex == -1)
                return false;

            //尝试将时间转化为DateTime类型
            try
            {
   
   
                string startTime = data.Substring(0, timeSplitIndex);
                string endTime = data.Substring(timeSplitIndex + 1, dateSplitIndex - timeSplitIndex - 1);

                DateTime startDateTime = DateTime.Parse(startTime);
                DateTime endDateTime = DateTime.Parse(endTime);

                //转化为DateTime类型时,日期为程序运行时的日期。
                //此处判断防止用户自定义日期。
                if (startDateTime.Date == DateTime.Today && endDateTime.Date == DateTime.Today)
                    return true;
                else
                    return false;
            }
            catch
            {
   
   
                return false;
            }
        }

        /// <summary>
        /// 文本框的验证事件
        /// </summary>
        private void tbDateContent_Validating(object sender, CancelEventArgs e)
        {
   
   
            int lineIndex = 0;
            foreach (string line in tbDateContent.Lines)
            {
   
   
                lineIndex++;
                if(line!=null && line.Trim()!=string.Empty && !ValidateFormat(line))
                {
   
   
                    e.Cancel = true;
                    break;
                }
            }

            if (e.Cancel)
            {
   
   
                epContent.SetError(label1, string.Format("第{0}行验证出现错误!详情按F1", lineIndex));
            }
            else
            {
   
   
                epContent.Clear();
            }
        }

        /// <summary>
        /// timer事件
        /// </summary>
        private void tmrReminder_Tick(object sender, EventArgs e)
        {
   
   
            //在lvDateList中的且开启了提醒功能,才进行提示。
            ListViewItem lvi = lvDateList.FindItemWithText(DateTime.Now.ToShortDateString());
            if (lvi == null || !lvi.Checked)
                return;

            Queue<string> reminderMessage = new Queue<string>();

            string reminderData = _reminderData[DateTime.Today];
            string[] dataArray = reminderData.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

            foreach (string data in dataArray)
            {
   
   
                //此处假设所有数据的格式均合法。
                int timeSplitIndex = data.IndexOf('-');
                int dateSplitIndex = data.IndexOf(' ');

                string startTime = data.Substring(0, timeSplitIndex);
                string date = data.Substring(dateSplitIndex + 1);
                DateTime startDateTime = DateTime.Parse(startTime);

                if (startDateTime.Hour == DateTime.Now.Hour && startDateTime.Minute == DateTime.Now.Minute)
                    reminderMessage.Enqueue(date);
            }

            while (reminderMessage.Count > 0)
            {
   
   
                MessageBox.Show("您的日程安排已到期:" + reminderMessage.Dequeue(), "日程安排提示窗口");
            }
        }

        private void lvDateList_ItemDrag(object sender, ItemDragEventArgs e)
        {
   
   
            lvDateList.DoDragDrop(e.Item, DragDropEffects.Copy);
        }

        private void tbDateContent_DragEnter(object sender, DragEventArgs e)
        {
   
   
            e.Effect = DragDropEffects.Copy;
        }

        private void tbDateContent_DragDrop(object sender, DragEventArgs e)
        {
   
   
            ListViewItem lvi = (ListViewItem)e.Data.GetData(typeof(ListViewItem));
            DateTime dt = DateTime.Parse(lvi.Text);
            mcDate.SelectionStart = dt;
            tbDateContent.Text = _reminderData[dt];
        }
    }
}

总结

目录
相关文章
SwiftUI—方便用户选择日期的DatePicker日期拾取器
SwiftUI—方便用户选择日期的DatePicker日期拾取器
1449 0
SwiftUI—方便用户选择日期的DatePicker日期拾取器
|
C# 前端开发
WPF DatePicker默认显示当前日期,格式化为年月日
原文:WPF DatePicker默认显示当前日期 WPF的日历选择控件默认为当前日期,共有两种方法,一种静态,一种动态。 静态的当然写在DatePicker控件的属性里了,动态的写在对应的cs文件里,具体请看下面。
6238 0
|
4月前
MFC添加年月日时分秒控件
MFC添加年月日时分秒控件
|
6月前
|
小程序 开发者
微信小程序显示当前系统年月日时分秒
微信小程序显示当前系统年月日时分秒
96 0
|
12月前
零基础VB教程033期:日期时间类型活学活用-案例倒计时工具
零基础VB教程033期:日期时间类型活学活用-案例倒计时工具
从零开始学Pyqt5之【控件介绍】(16):日历与时间控件QCalendar、QDateTImeEdit
从零开始学Pyqt5之【控件介绍】(16):日历与时间控件QCalendar、QDateTImeEdit
从零开始学Pyqt5之【控件介绍】(16):日历与时间控件QCalendar、QDateTImeEdit
|
Shell 程序员
Qt编写自定义控件65-光晕日历
一、前言 操作系统的更新迭代速度非常快,基本上三五年就有个新版本出来,WIN10操作系统还是一个比较成功的系统,据说现在市场份额越来越大,XP的份额已经很小,WIN7的份额也在逐步减少,在最新的WIN10系统中,右下角有个日历控件,还是自带农历的,这个本地化做的蛮好的,鼠标移上去还有光晕背景效果,体验非常赏心悦目,于是打算用Qt也高仿一个。
1429 0
|
C#
WPF 自定义DateControl DateTime控件
原文:WPF 自定义DateControl DateTime控件 自定义日期控件,月份选择。如下是日期的一些效果图。 具体的样式、颜色可以根据下面的代码,自己调节即可    1、日期控件的界面 ...
1535 0
|
Android开发 iOS开发
带农历日历的DatePicker控件!Xamarin控件开发小记
原文:带农历日历的DatePicker控件!Xamarin控件开发小记 闲来无事开发了个日期选择控件,感兴趣的同学前往: https://github.com/MatoApps/Mato.DatePicker Mato.
1700 0
|
C#
WPF 4.0 DatePicker 快速录入
原文:WPF 4.0 DatePicker 快速录入 WPF 4.0的DatePicker在通过键盘录入日期的时候是非常让人郁闷的。必须按照日期的格式来完整输入例如,比如输入“2010/10/10”才能识别。
773 0