持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
历史数据查询
对于之前的章节,我们已经实现了定时获取数据,并可以进行表格或者曲线的实时展示功能。
那么对于入库后的数据,我们也需要提供历史数据的查询,方便使用者对数据的追踪和分析
历史数据查询的制作也简单的分为界面的制作和代码的编写
新增界面
我们新建一个文件夹,叫做HisData,新建立一个窗口类,HisData.cs
窗口实现,我们先拖一个tablelayoutpanel到界面,docker设置为fill
行列设置如下图所示:(具体实现可以查看之前的文章,winform的自适应)
行列分好后,我们在第一行中拖入两个时间选择控件,datetimepick,并在最后一列中拖一个按钮。
在第三行中,拖入一个datagrideview,完成后如下所示:
修改代码
数据库新增查询
使用时间关键字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();
}
}