啊哈,第一次写,因为刚做好一个系统,本人水平不高,遇到问题很急躁,但是好在压着性子做出来了。只想记录一下我做的过程,给和我一样不懂的朋友借鉴,希望大家都能更好。不至于遇到问题找不到很快能实施的办法,焦躁焦躁。
我的系统是基于C# Winform开发的一个校园卡管理系统,加了一个数据可视化功能,所以需要把数据库的数据实时展示出来,听起来“实时”很吓人,但是其实每个操作执行后都会更新到数据库里,每次重新读数据库的信息就是“实时”了。毕竟咱只是个模拟系统。
如何从Visual Studio2019的工具栏找出chart控件并拖拽到默认界面应该不用多说吧,找不到工具栏的话开发界面最上面有个搜索框,搜一下就出来了。如果再没有可以百度,这是开发软件的基础配置问题。
鼠标点击你的chart控件(默认是个柱状图),在属性框里有很多属性栏目。其中关于chart控件最主要的图表属性里有5个属性:
上面这几个。刚开始我也不懂,很焦躁地点来点去,因为找到的教程大多是代码画图,要么就是版本不一样的vs对不上号,看不懂。但是如果你用探索的心态去玩,会发现,喔~
这里贴一个对我帮助很大的链接,是简书上的一个小伙伴,BigbyLong,感谢,侵删。C#中Chart的简单使用(柱状图和折线图) - 简书 (jianshu.com)
哦,给你们看一下我的实验对象:
自己在项目之外开个“实验品”,放心大胆地跟着教程尝试。
那就先,散点图吧。所有的教程都告诉我,series属性贼重要,实践后我非常赞同。
点击charttype后,有好多选择,那我们选第一个point图。
然后你就看见默认的柱形图变成了散点图。啊,接下来我可不是要带你设置散点图的标题、背景、颜色之类的,我要把数据放进去了。最简单的逻辑:用数组存储好你要的数据,然后用函数DataBindXY(数组A, 数组B); 把数据和chart绑定,就实现了。
我是这么做的。先想一想,你要用散点图干嘛。x轴,横轴,代表什么。y轴代表什么。
我的横轴是日期,纵轴是一个学生在这个日期用餐的次数。那就简单了,我用sql语句从数据库读取一下,这个人在这个日期中所有的用餐记录条数就可以了,然后把今天以前的6天数据也读取,存到对应于y轴数值的数组里,(毕竟这个图还是能看到好几天的数据),然后绑定下就好啦。上代码:
//根据选择的时间+学号,查询当日在ABC的总消费次数。
int[] num = new int[] {0,0,0,0,0,0 };//y轴数值数组,存储次数
string[] riqi = new string[] {"","","","","","" };//x轴数值数组,存储对应的日期
DataLink dl = new DataLink();//数据库链接
string sql = $"select count(*) from CardADB.dbo.Bill where cardNum='{textBox1.Text}' and sellDate='{dateTimePicker1.Value.ToString("yyyy-MM-dd")}' and (place ='A食堂' or place = 'B食堂' or place = 'C食堂')";
IDataReader dc = dl.read(sql);//读取数据
while (dc.Read())
{
num[0] = int.Parse(dc[0].ToString());//把次数存储起来
}
riqi[0] = dateTimePicker1.Value.ToString("yyyy-MM-dd");
DateTime date = dateTimePicker1.Value.AddDays(-1);
string sql2 = $"select count(*) from CardADB.dbo.Bill where cardNum='{textBox1.Text}' and sellDate='{date.ToString("yyyy-MM-dd")}' and (place ='A食堂' or place = 'B食堂' or place = 'C食堂')";
dc = dl.read(sql2);
while (dc.Read())
{
num[1] = int.Parse(dc[0].ToString());
}
riqi[1] = date.ToString("yyyy-MM-dd");
date = dateTimePicker1.Value.AddDays(-2);
string sql3 = $"select count(*) from CardADB.dbo.Bill where cardNum='{textBox1.Text}' and sellDate='{date.ToString("yyyy-MM-dd")}' and (place ='A食堂' or place = 'B食堂' or place = 'C食堂')";
dc = dl.read(sql3);
while (dc.Read())
{
num[2] = int.Parse(dc[0].ToString());
}
riqi[2] = date.ToString("yyyy-MM-dd");
date = dateTimePicker1.Value.AddDays(-3);
string sql4 = $"select count(*) from CardADB.dbo.Bill where cardNum='{textBox1.Text}' and sellDate='{date.ToString("yyyy-MM-dd")}' and (place ='A食堂' or place = 'B食堂' or place = 'C食堂')";
dc = dl.read(sql4);
while (dc.Read())
{
num[3] = int.Parse(dc[0].ToString());
}
riqi[3] = date.ToString("yyyy-MM-dd");
date = dateTimePicker1.Value.AddDays(-4);
string sql5 = $"select count(*) from CardADB.dbo.Bill where cardNum='{textBox1.Text}' and sellDate='{date.ToString("yyyy-MM-dd")}' and (place ='A食堂' or place = 'B食堂' or place = 'C食堂')";
dc = dl.read(sql5);
while (dc.Read())
{
num[4] = int.Parse(dc[0].ToString());
}
riqi[4] = date.ToString("yyyy-MM-dd");
date = dateTimePicker1.Value.AddDays(-5);
string sql6 = $"select count(*) from CardADB.dbo.Bill where cardNum='{textBox1.Text}' and sellDate='{date.ToString("yyyy-MM-dd")}' and (place ='A食堂' or place = 'B食堂' or place = 'C食堂')";
dc = dl.read(sql6);
while (dc.Read())
{
num[5] = int.Parse(dc[0].ToString());
}
riqi[5] = date.ToString("yyyy-MM-dd");
chart3.Series[0].Points.DataBindXY(riqi, num);
dc.Close();
dl.DaoClose();
哎呀。我不会像别人那样搞个专门粘贴代码的背景,看起来不太舒服。可恶。先这样,下次我试试看怎么弄。
对了,上面的代码我放在一个按钮的点击事件里面了,还有个datetimepicker控件用来选查看的日期、一个textbox输入学生学号的。那就看下运行结果。
这是啥也没有的状态,因为我没有设置默认下的样子。要设置的话,也是在series里点击point添加数值。
这是没输入学号的结果。啥也没有。
最后输入学号、选择日期,就是结果图了。
好啦,不想写太多很罗嗦,其他的放在下一章。拜拜。