c# 从0实现一个温湿度监测的小工具 (7)

502 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

概述:

之前的章节,我们实现了一个温湿度软件的基本功能。并已经功能的把数据存储到数据库中。
本章节,我们将会利用winform的表格控件和定时器控件来实现数据的自动采集和入库。

修改界面

修改界面,增加表格控件。 开发form1的设计器。修改界面。
我们在工具中搜索data,找到datagridview,拖入窗体中。

1654679500(1).png

最终修改完毕的界面如下图:

1654679920(1).png

增加一个定时器

在工具中搜索timer,找到tiemer控件,并拖入窗体

1654680010(1).png

完成后如下;

image.png

我们修改timer的属性:
其中,interval表示定时器重载时间,单位ms,我们定时10s,输入10000
enabled表示是否初始化就启动定时器,我们选择true

image.png

点击timer1,自动生成到点回调函数

        /// <summary>
        /// 定时器回调
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {

        }

初始化表格

表格的初始化,需要在load函数中完成。这样我们加载完界面,表格就显示出来了。 datagridview的初始化主要是初始化表头信息。
首先声明一个全局的datatable变量,作为表格的数据源。\

        /// <summary>
        /// 数据缓存
        /// </summary>
        private DataTable DataBuffer = null;
        /// <summary>
        /// 序号
        /// </summary>
        private int Index = 0;

初始化datatable数据源

        /// <summary>
        /// 初始化结构
        /// </summary>
        private void InitDataTable()
        {
            DataBuffer = new DataTable();
            DataBuffer.Columns.Add("ID");
            DataBuffer.Columns.Add("温度");
            DataBuffer.Columns.Add("湿度");
            DataBuffer.Columns.Add("时间");
        }

初始化表格

        /// <summary>
        /// 初始化表格
        /// </summary>
        private void InitDataGrid()
        { 
            //自适应列宽
            dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
            //绑定数据到DataGridView
            dataGridView1.DataSource = DataBuffer;
            //不显示最后一个行
            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.ReadOnly = true;
            //去除首列
            dataGridView1.RowHeadersVisible = false;
            //刷新
            dataGridView1.Refresh();
        }

load函数调用初始化

注意先调用buffer初始化,再调用表格初始化

            //初始化数据
            InitDataTable();
            InitDataGrid();

实现定时器到点事件

        /// <summary>
        /// 定时器回调
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (Runport.IsOpen)
            {
                //获取地址
                byte addr = byte.Parse(this.textBox1.Text);
                string ret = THSensor.ReadTHDataFromSensor(Runport, addr);
                if (!string.IsNullOrEmpty(ret))
                {
                    string temp = ret.Split('&')[0];
                    string humi = ret.Split('&')[1];
                    //入库操作
                    DB_SerAPI.SaveTHData(temp, humi);
                    //刷新列表
                    string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    if (DataBuffer != null)
                    {
                        Index++;
                        DataRow row = DataBuffer.NewRow();
                        row["ID"] = Index.ToString();
                        row["时间"] = time;
                        row["温度"] = temp;
                        row["湿度"] = humi;
                        DataBuffer.Rows.Add(row);

                    }
                }
                else
                {
                    MessageBox.Show("无数据,请检查配置参数");
                }
            }
        }

测试

image.png

下一章节,我们将实现利用charts 控件,实现实时曲线的显示