近日用Highchart做了个小功能,在后面动态配置数据源,然后在前面用Highchart显示出数据源中相关的那些数据,
写了一天的这个功能,我觉得吧,最激动人心的就是在前面转化datatable的这段上面
在数据源中,我是定了一个这样的列表,这样动态设置数据源的方式有一个好处,就是以后解析的话,你只需要写sql语句或者sql的存储过程,前面怎么样解析是不用去管,有点一劳永逸的感觉
数据源示例统计类 | 数量 | x轴 | y轴 | 类型 | 单位 | 标题 |
维修单 | 10 | XX机构 | 单位(张) | column | 张 | XXOO图表统计 |
维修单 | 10 | XX机构 | 单位(张) | column | 张 | XXOO图表统计 |
装修单 | 10 | YY机构 | 单位(张) | column | 张 | XXOO图表统计 |
然后在后台的代码页中读取这个数据源,并且将数据源组装成json绑定到Highchart中
这样的话会遇到两个问题
1.数据源中的每一个[x轴]中对应的统计类数量不一致
2.转化成json的时候读取datatable的顺序不一致,导致统计类的数据出现张冠李戴的数量
对于问题一的话,解决思路如下
获取[统计类]种类最多的那个X轴名称=>获取对应的那个[x轴]下面对应的]统计类]列表=>对比其他[x轴]下面的统计类,如果[统计类]数量一样,跳过,不一样则添加一条数量为0的记录
(X,好像越写越乱了)果断上代码
////// 转化DataTable /// /// private void ChangeTable(ref DataTable dt) { //统计类最多的X轴大类 string MaxTypex = GetMaxType(dt); //获取统计类最多的X轴大类下面所有的统计类 Listli = (from dts in dt.AsEnumerable() where dts["类型"].ToString() == "column" && dts["x轴"].ToString() == MaxTypex select dts["统计类"].ToString()).Distinct().ToList(); List Typex = (from dts in dt.AsEnumerable() where dts["类型"].ToString() == "column" && dts["x轴"].ToString() != MaxTypex select dts["x轴"].ToString()).Distinct().ToList(); for (int i = 0; i < Typex.Count; i++) { //比较li中的数据,如果没有的话,添加进datatable,但是他的数量为0 InsertTable(ref dt, Typex[i], li, MaxTypex); } } private void InsertTable(ref DataTable dt, string Typex, List li, string MaxTypex) { List Countli = (from dts in dt.AsEnumerable() where dts["类型"].ToString() == "column" && dts["x轴"].ToString() == Typex select dts["统计类"].ToString()).Distinct().ToList(); if (Countli.Count == li.Count) { return; } for (int i = 0; i < li.Count; i++) { if (!Countli.Contains(li[i])) { DataRow dr = dt.NewRow(); dr["x轴"] = Typex; dr["统计类"] = li[i]; dr["数量"] = 0; dr["类型"] = "column"; dt.Rows.Add(dr); } } } //获取x轴上统计类最多的一个x轴类别 private string GetMaxType(DataTable dt) { //获取x轴中所有的类别->获取x轴类别下面所有统计类的数量->取数量最多的那个-返回 List li = (from dts in dt.AsEnumerable() where dts["类型"].ToString() == "column" select dts["x轴"].ToString()).Distinct().ToList(); DataTable dtTemp = new DataTable(); dtTemp.Columns.Add(new DataColumn("Key", typeof(String))); dtTemp.Columns.Add(new DataColumn("value", typeof(Int32))); for (int i = 0; i < li.Count; i++) { // matchs.Add(li[i], dt.Select("类型='column' and x轴='" + li[i] + "'").Count());DataRow drTemp=dtTemp.NewRow(); drTemp["Key"] = li[i]; drTemp["value"] = dt.Select("类型='column' and x轴='" + li[i] + "'").Count(); dtTemp.Rows.Add(drTemp); } //遍历临时的datatable 获取最大的value值,如果有两个以上相同最大的,获取第一个 int MaxValue = Convert.ToInt32(dtTemp.Rows[0]["value"]); for (int j = 0; j < dtTemp.Rows.Count; j++) { if (MaxValue < Convert.ToInt32(dtTemp.Rows[j]["value"])) { MaxValue = Convert.ToInt32(dtTemp.Rows[j]["value"]); } } string MaxKey = dtTemp.Select("value=" + MaxValue)[0]["Key"].ToString(); return MaxKey; }
对于问题2的,只要把原先的数据源排下序就好了,先根据X排序,再排统计类
private void ShortTable(ref DataTable dt) { dt.DefaultView.Sort = "x轴,统计类"; dt = dt.DefaultView.ToTable(); }