因为这算是学c#之后第一个自己非常有热情编写的一个程序,加上最近需要重构这个项目,所以记录一下编写的过程。
1.编写目标
原来记录时间使用的是有道云笔记中的表格和excel中的汇总结合。如下图:
缺点非常明显:
- 统计时需要从有道云笔记手动输入到excel中
- 所有的记录以文字方式存在有道云笔记里,浏览困难,容易丢失
契机是当时学了数据库的基本知识,那天睡午觉时突然想到,这种一条条的记录和sql的表非常相似啊,或许可以用c#编写一个高度契合自己需要的exe。
希望实现的功能有:
- 数据存放在sql中
- 能用GUI方便地向sql中添加一条条数据,每条数据大概包括:事件类型,时长,重要程度等等
- 能使用datagridview方便地浏览每天发生的事件。并且能对每周,每月的数据进行汇总分析,能把分类的分析结果用折线图,饼形图显示出来。
基本用到的工具就是:sql,datagridview,winform中的chart控件。
因为当时编写时非常菜,结构十分混乱,所以这里只讲其中“攻克”的几个小问题,具体的结构等到我重构代码之后再说。
2.日期这种格式的存放方式
学sql时没看到date这种格式,差点就把年月日分开存了。。。真菜
但是c#中的datetimepicker控件和sql中的datetime数据类型确实帮了我的大忙,进行汇总时尤其方便。
- 存入数据库时以:dateTimePicker1.Value.ToString("yyyy-MM-dd")的方式在c#和sql中流通。
- 同月的查询非常好写:where datediff(month,日期,'" + date + "')=0
- 同周的查询有点麻烦,因为西方习惯把周日当做第一天。我看到了把第一天设置为周一的办法,但是用起来效果并不好,所以采取了一种傻瓜式的方式:
where (datediff(week,日期,DATEADD(day,-1,'" + date + "'))=0 AND DATEPART(WEEKDAY,日期)!=7) OR (DATEPART(WEEKDAY,日期)=7 AND datediff(week,日期,DATEADD(day,-1,'" + date + "'))=-1)
这个东西重构时要重点关注一下,看起来丑,查询效率肯定也低。
3.datagridview绑定查询出来的sql结果
这部分有点晕头转向,基本是按照网上一个教程写的,重构时要重点注意一下
- 大概是SqlDataAdapter数据进入dataset,dataset的数据进入datatable,最后datagridview的数据绑定datatable
- 添加汇总行时,在datatable中新建一行并添加
DataRow dr = dt.NewRow();
int index = table.RowCount;
dt.Rows.InsertAt(dr, index);
table.Rows[index].Cells[0].Value = "全天统计";
table.Rows[index].Cells[2].Value = time_sum;
4.全页显示datagridview和左右分别显示datagridview和chart之间的切换
目前的做法挺傻的,我没在代码里新建控件,反倒是一开始就拖动到form里面了。trick是更改绑定的panel和隐藏控件。
这种肯定有通用的做法的,到时看看通用的做法是什么
5.访问数据库的办法
这部分基本照抄学习视频的做法,现在看的书里面都是把数据层和业务层分开,操作数据库专门写一个类库,重构时要掌握这种通用的办法。
6.项目的架构
这就体现出菜鸟和老手的区别。
由于一开始就没有把想法搭建好,导致代码结构非常乱。现在有两个form,一个viewdata类(实在重用的代码太多才建的类)。
现在这种架构代码的方式是学习c#的重中之重,我看了书之后已经有了些思路。大概是两个基类:数据库类,操作数据库的类。业务层分一个添加类和一个查询的类。这部分还是想的不够清楚,还是对类的概念理解不够深。
7.说到最后
目前工作之外手头有四个想自己实现的小项目
- 重构record_time项目,重点是要学会科学的架构
- 或许能编写一个安卓端?云数据库?因为record_time这个exe很多时候要用电脑很不方便
- 一个带书签,书签能提示这个音频节点内容的音频播放器。这个我原来一直想找但是没找到,现在可以自己做一个。
- 一个使用GMAP的,能记录自己想去的地方和去过的地方的exe。如果谷歌地球能达到我的需求,用谷歌地球就好。