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

286 阅读2分钟

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

历史数据查询

对于之前的章节,我们已经实现了定时获取数据,并可以进行表格或者曲线的实时展示功能。
那么对于入库后的数据,我们也需要提供历史数据的查询,方便使用者对数据的追踪和分析
历史数据查询的制作也简单的分为界面的制作和代码的编写

新增界面

我们新建一个文件夹,叫做HisData,新建立一个窗口类,HisData.cs
窗口实现,我们先拖一个tablelayoutpanel到界面,docker设置为fill
行列设置如下图所示:(具体实现可以查看之前的文章,winform的自适应)

image.png

image.png

行列分好后,我们在第一行中拖入两个时间选择控件,datetimepick,并在最后一列中拖一个按钮。
在第三行中,拖入一个datagrideview,完成后如下所示:

image.png

修改代码

数据库新增查询

使用时间关键字between and 查找区间数据

        /// <summary>
        /// 根据时间区间获取数据
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        public static DataTable GetDataBetweenTime(string start,string end)
        {
            string sqlcmd = $"Select * from THData where intime between '{start}' and '{end}'";
            return MySqliteAPI.GetDataFromDB(sqlcmd);
        }

实现按钮点击

确定查找,逻辑实现的顺序是:

  • 判断时间是否选择,并判断起始时间格式是否正确
  • 根据时间区间查库
  • 刷新表格显示 具体实现的方式如下
        /// <summary>
        /// 按钮点击函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                //判断时间
                DateTime start = this.dateTimePicker1.Value;
                DateTime end = this.dateTimePicker2.Value;
                if (DateTime.Compare(start, end) <= 0)
                {
                    //根据时间查库
                    DataBuffer = DB_SerAPI.GetDataBetweenTime(start.ToString("yyyy-MM-dd HH:mm:ss"),
                                                                end.ToString("yyyy-MM-dd HH:mm:ss"));
                    if (DataBuffer == null)
                        MessageBox.Show("获取数据失败");
                    else
                    {
                        InitDataGrid();
                    }
                }
                else
                {
                    MessageBox.Show("起始时间需要早于结束时间");
                }
            }
            catch (Exception ex)
            {
                MyLogger._.Error(ex.Message + "\r\n" + ex.StackTrace);
                MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace);
            }
        }

修改mainWin

treeview 侧边历史数据双击事件实现

        /// <summary>
        /// 双击回调
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_DoubleClick(object sender, EventArgs e)
        {
            string selname = this.treeView1.SelectedNode.Text;
            //MessageBox.Show(selname);
            switch (selname)
            {
                case "表格模式":
                    OpenDataGrideWin();
                    break;
                case "曲线模式":
                    OpenDataLineWin();
                    break;
                case "历史数据":
                    OpenHisDataWin();
                    break;
                case "数据报表":
                    MessageBox.Show("TDO");
                    break;
                default:
                    break;
            }
        }
                /// <summary>
        /// 打开历史数据窗口
        /// </summary>
        private void OpenHisDataWin()
        {
            if (!IsWinOpened("HisWin"))
            {
                HisData hiswin = new HisData();
                hiswin.MdiParent = this;
                hiswin.Name = "HisWin";
                hiswin.WindowState = FormWindowState.Maximized;
                hiswin.Show();
            }
        }

测试

image.png