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

原创 2018年04月15日 23:26:10

有时候在办公室里写一些小软件会想着自动更新、每日更新、定时更新的功能,比如每天到点就发个邮件,到点了就统计一下当前的网络数据什么的。写代码的时候主要考虑: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# 定时执行函数(winForm)

需要使用timer 定时器控件 timer1.Interval 设置时间间隔timer1.Tick 到达时间间隔时触发事件test_tick 时间处理函数timer1.Tick   +=   new ...
  • xujianrj
  • xujianrj
  • 2008-02-20 14:34:00
  • 8648

c# winform 定时开启关闭小程序

  • 2013年07月11日 19:57
  • 12KB
  • 下载

winform新手使用Timer计时器让窗口自动跳转(在几秒后自动关闭)

winform之单线程使用Timer计时器让窗口在几秒后自动关闭
  • JessieCoder
  • JessieCoder
  • 2015-02-22 17:41:03
  • 3149

C#Winform定时执行一段程序

写了一个Winform,需要完成定时采集数据的功能,找到了一个解决办法。 System.Timers.Timer timer = new System.Timers.Timer();timer.En...
  • u010780613
  • u010780613
  • 2015-09-24 12:18:53
  • 5212

CSharp WinForm启动后自动隐藏窗口

  • 2009年08月01日 22:07
  • 236KB
  • 下载

C#winForm程序定时执行某各功能--定时检查更新

需要使用timer 定时器控件  timer1.Interval 设置时间间隔 timer1.Tick 到达时间间隔时触发事件 test_tick 时间处理函数 timer1....
  • youaregoo
  • youaregoo
  • 2012-12-09 02:29:02
  • 1959

C# Winform窗体自动运行隐藏

c#
  • kjlrzzyffmx
  • kjlrzzyffmx
  • 2015-10-12 10:13:35
  • 3564

winform判断一个窗口是否打开并显示出来

判断一个窗口是否打开,和显示当前窗口:form1中声明:private Form2 f2;在需要弹出窗口的处理上做如下修正:if (f2 == null||f2.IsDisposed) ...
  • firetaker
  • firetaker
  • 2010-04-26 15:48:00
  • 7862

使用C#系统服务定时执行操作

1.新建项目 --》 Windows 服务 2.Service1.cs代码  using System; using System.Collections.Generic; using System...
  • smartsmile2012
  • smartsmile2012
  • 2014-01-07 14:08:50
  • 1672

[C#]Thread与委托实现定时刷新数据功能

用户需求:定时抓取ERP系统条码已扫描未审核单据 解决办法: 由于采用Timer控件会消耗系统资源,故采用线程处理。 由于线程调用方法不支持控件处理模式,故采用委托方法实现。 bool...
  • david_520042
  • david_520042
  • 2016-11-18 15:10:02
  • 2986
收藏助手
不良信息举报
您举报文章:C# winform下的定时运行+时间设置窗口
举报原因:
原因补充:

(最多只允许输入30个字)