C# winform下的定时运行+时间设置窗口

有时候在办公室里写一些小软件会想着自动更新、每日更新、定时更新的功能,比如每天到点就发个邮件,到点了就统计一下当前的网络数据什么的。写代码的时候主要考虑:1、设置时间点;2、怎么定时运行。

之前在写网络拓扑信息统计的时候,写了个设置定时的窗口(SetTimeForm),外观长这样:


SetTimeForm的相关tips如下:

  1. 左边的ListBox显示已设置的时间点(HH:mm);
  2. 右边的textBox用以输入需新增的时间点,点【添加时间】按钮或按回车键,可以将textBox中的时间点添加至ListBox中;
  3. 在ListBox中选中需要删除的时间点(可多选),点击【删除时间】按钮,可以从ListBox中删除;
  4. 点击右上角关闭窗口时,会将ListBox中的时间点,保存到本地路径的一个txt文件里。

SetTimeForm的具体代码如下:

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

namespace zipTestForm
{
    public partial class SetTimeForm : Form
    {
        private static String strTimeSpanFilePath = Application.StartupPath + @"\timeSpan.txt";

        public SetTimeForm()
        {
            InitializeComponent();
            
            //读取timeSpan.txt,load出之前保存的时间点数据
            //并显示在listBox上
            if (File.Exists(strTimeSpanFilePath))
            {
                StreamReader sr = new StreamReader(strTimeSpanFilePath, Encoding.Default);
                String line;
                while ((line = sr.ReadLine()) != null)
                {
                    listBoxTimeTable.Items.Add(line);
                }
                sr.Close();
            }
        }


        //*******************************
        //按下addTime按钮后,将textbox中填写的时间添加到listbox
        //*******************************
        TimeSpan timeSpan;
        private void btnAddTime_Click(object sender, EventArgs e)
        {
            if (TimeSpan.TryParse(tbTimeInput.Text, out timeSpan))
            {
                string timeSpanStr = timeSpan.ToString(@"hh\:mm");
                //判断是否与先前填写的时间重复
                if (listBoxTimeTable.Items.Contains(timeSpanStr))
                {
                    MessageBox.Show("输入的时间已存在。");
                }
                // 将时间点添加至listBox
                else
                {
                    listBoxTimeTable.Items.Add(timeSpanStr);
                    tbTimeInput.Clear();
                }
            }
            else
            {
                MessageBox.Show("输入时间有误。");
            }
        }


        //*******************************
        //在textbox控件中如果按下Enter键,也可以addTime
        //*******************************
        private void tbTimeInput_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnAddTime_Click(null, EventArgs.Empty);
            }
        }


        //*******************************
        //按钮,点击可删除listbox中selected的时间点
        //*******************************
        private void btnDeleteTime_Click(object sender, EventArgs e)
        {
            if (listBoxTimeTable.SelectedItems.Count > 0)
            {
                string[] strs = listBoxTimeTable.SelectedItems.Cast<string>().ToArray();
                foreach(string str in strs)
                {
                    listBoxTimeTable.Items.Remove(str);
                }
            }
        }


        //*******************************
        //在关闭SetTimeForm的时候,保存listbox中的数据到timeSpan.txt中
        //*******************************
        private void SetTimeForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            FileStream fs = new FileStream(strTimeSpanFilePath, FileMode.Create);
            StreamWriter sw = new StreamWriter(fs);
            //开始写入
            foreach(string str in listBoxTimeTable.Items)
            {
                sw.WriteLine(str);
            }
            //清空缓冲区
            sw.Flush();
            //关闭流
            sw.Close();
            fs.Close();
        }
    }
}


定时运行用的是System.Timers.Timer,在目前winform的应用中我一般会设置两个按钮,分别是【定时运行】、【设置定时】:



【设置定时】按钮的响应代码如下,点击后即进入SetTimeForm进行时间点的设置:

// 设置定时窗口
        SetTimeForm setTimeForm = null;
        private void btnSetTime_Click(object sender, EventArgs e)
        {
            if (setTimeForm == null || setTimeForm.IsDisposed)
            {
                setTimeForm = new SetTimeForm();
            }

            setTimeForm.Parent = this.Owner; //建立父子关系
            setTimeForm.ShowDialog(); //显示子窗口
            setTimeForm.Focus();  //子窗口获得焦点
        }

【启动定时运行】按钮的响应代码如下:

// btn定时运行
        private void btnRunTimer_Click(object sender, EventArgs e)
        {
            //判断是否有设置时间点
            if(btnRunTimer.Text.Equals("启动定时运行"))
            {
                if (File.Exists(strTimeSpanFilePath))
                {
                    // 读取本地txt里的时间点
                    listTimeSpan = LoadTimeSpanToList();

                    if (listTimeSpan.Count > 0)
                    {
                        btnRunTimer.Enabled = true;
                        btnRunTimer.Text = "关闭定时运行";
                        myTimer.Start();
                    }
                    else
                    {
                        MessageBox.Show("未设置时间点。");
                    }
                }
                else
                {
                    MessageBox.Show("未设置时间点。");
                }
            }
            else
            {
                btnRunTimer.Text = "启动定时运行";
                myTimer.Stop();
            }
        }

在主窗口程序中,再添加以下代码:

        // 设置定时器间隔为1000ms (1min)
        private System.Timers.Timer myTimer = new System.Timers.Timer(1000);
        List<string> listTimeSpan;
        //TimeSpan.txt文件的路径
        private static String strTimeSpanFilePath = Application.StartupPath + @"\timeSpan.txt";

        private void Form1_Load(object sender, EventArgs e)
        {
            //*******************************
            //注册定时事件
            //*******************************
            //设备定时器为重复运行,而不是只运行一次
            myTimer.AutoReset = true;
            myTimer.Elapsed += new System.Timers.ElapsedEventHandler(Timers_TimesUp);
        }

        //*******************************
        //定义timesUp函数
        //*******************************
        private void Timers_TimesUp(object obj, System.Timers.ElapsedEventArgs e)
        {
            //判断是否有时间点
            if (listTimeSpan.Contains(e.SignalTime.ToString("HH:mm")))
            {
                // do sth when timesup
            }
        }

        //*******************************
        //定义LoadTimeSpanToList函数
        //将记事本中的时间读取到list中
        //*******************************
        private List<string> LoadTimeSpanToList()
        {
            List<string> listTemp = new List<string>();
            StreamReader sr = new StreamReader(strTimeSpanFilePath, Encoding.Default);
            String line;
            while ((line = sr.ReadLine()) != null)
            {
                listTemp.Add(line);
            }
            sr.Close();
            return listTemp;
        }


以上便可完成一个winform下的设置定时的窗口,以及主程序的定时运行。


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/muxiong0308/article/details/79954261
上一篇C# 递归解析xml文件
下一篇假如有个管理管理办法的平台?
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭