Highchart的一些总结

近日用Highchart做了个小功能,在后面动态配置数据源,然后在前面用Highchart显示出数据源中相关的那些数据,

写了一天的这个功能,我觉得吧,最激动人心的就是在前面转化datatable的这段上面


在数据源中,我是定了一个这样的列表,这样动态设置数据源的方式有一个好处,就是以后解析的话,你只需要写sql语句或者sql的存储过程,前面怎么样解析是不用去管,有点一劳永逸的感觉

数据源示例

统计类数量x轴y轴类型单位标题
维修单10XX机构单位(张)columnXXOO图表统计
维修单10XX机构单位(张)columnXXOO图表统计
装修单10YY机构单位(张)column XXOO图表统计

然后在后台的代码页中读取这个数据源,并且将数据源组装成json绑定到Highchart中

这样的话会遇到两个问题

1.数据源中的每一个x轴中对应的统计类数量不一致

2.转化成json的时候读取datatable的顺序不一致,导致统计类的数据出现张冠李戴的数量

对于问题一的话,解决思路如下

获取[统计类]种类最多的那个X轴名称=>获取对应的那个x轴下面对应的]统计类]列表=>对比其他x轴下面的统计类,如果[统计类]数量一样,跳过,不一样则添加一条数量为0的记录

(X,好像越写越乱了)果断上代码


/// <summary>
    /// 转化DataTable
    /// </summary>
    /// <param name="dt"></param>
    private void ChangeTable(ref DataTable dt)
    {
        //统计类最多的X轴大类
        string MaxTypex = GetMaxType(dt);

        //获取统计类最多的X轴大类下面所有的统计类
        List<string> li = (from dts in dt.AsEnumerable() where dts["类型"].ToString() == "column" && dts["x轴"].ToString() == MaxTypex select dts["统计类"].ToString()).Distinct().ToList();

        List<string> 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<string> li, string MaxTypex)
    {
        List<string> 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<string> 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();
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值