找回密码
 立即注册

QQ登录

只需一步,快速开始

wanghaibo
论坛元老   /  发表于:2014-8-15 14:38  /   查看:8823  /  回复:7
经过我们测试发现我们给C1LineChart UI 传递两类数据源,dataset(datatable) 或datareader,然后绑定X,Y就可以显示数据了。但是我们往UI传递的是含有实体类的泛型集合,泛型集合不包含列名,所有我们还得重新在UI把泛型集合制作成datatable,然后绑定X,Y。这样很奇怪,很麻烦。我们希望葡萄城可以针对此问题,增加控件属性,或者帮我们写一个方法,当我们传进去一个泛型集合后自动返回此集合对应的datatable。我们也正在写此方法。我们希望找到一个最好的解决方案。



protected void Button2_Click(object sender, EventArgs e)
        {
            C1.Web.Wijmo.Controls.C1Chart.LineChartSeries s = null;
            s = new C1.Web.Wijmo.Controls.C1Chart.LineChartSeries();
            List<Class1Entity> ListClass1Entity = new List<Class1Entity>();
            Class1DAL class1DAL = new Class1DAL();
            ListClass1Entity = class1DAL.SelectASPTESTTtrend(DropDownList1.Text, DropDownList2.Text);

            DataTable dtzhkkl = new DataTable();

            dtzhkkl.Columns.Add("REPORTDATE", typeof(string));
            dtzhkkl.Columns.Add("REPORTHOUR", typeof(int));
            dtzhkkl.Columns.Add("DATA", typeof(double));
            dtzhkkl.Columns.Add("NAME", typeof(string));

            DataTable dtxxzjpw = new DataTable();

            dtxxzjpw.Columns.Add("REPORTDATE", typeof(string));
            dtxxzjpw.Columns.Add("REPORTHOUR", typeof(int));
            dtxxzjpw.Columns.Add("DATA", typeof(double));
            dtxxzjpw.Columns.Add("NAME", typeof(string));

            DataTable dtxkzjcl = new DataTable();

            dtxkzjcl.Columns.Add("REPORTDATE", typeof(string));
            dtxkzjcl.Columns.Add("REPORTHOUR", typeof(int));
            dtxkzjcl.Columns.Add("DATA", typeof(double));
            dtxkzjcl.Columns.Add("NAME", typeof(string));


            for (int i = 0; i < ListClass1Entity.Count; i++)
            {
                if (ListClass1Entity.NAME == "综合块矿率")
                {
                    DataRow dr = dtzhkkl.NewRow();

                    dr["REPORTDATE"] = ListClass1Entity.REPORTDATE;
                    dr["REPORTHOUR"] = ListClass1Entity.REPORTHOUR;
                    dr["DATA"] = ListClass1Entity.DATA;
                    dr["NAME"] = ListClass1Entity.NAME;
                    dtzhkkl.Rows.Add(dr);
                }

                if (ListClass1Entity.NAME == "选矿总精品位")
                {
                    DataRow dr = dtxxzjpw.NewRow();

                    dr["REPORTDATE"] = ListClass1Entity.REPORTDATE;
                    dr["REPORTHOUR"] = ListClass1Entity.REPORTHOUR;
                    dr["DATA"] = ListClass1Entity.DATA;
                    dr["NAME"] = ListClass1Entity.NAME;
                    dtxxzjpw.Rows.Add(dr);
                }

                if (ListClass1Entity.NAME == "选矿总精产量")
                {
                    DataRow dr = dtxkzjcl.NewRow();

                    dr["REPORTDATE"] = ListClass1Entity.REPORTDATE;
                    dr["REPORTHOUR"] = ListClass1Entity.REPORTHOUR;
                    dr["DATA"] = ListClass1Entity.DATA;
                    dr["NAME"] = ListClass1Entity.NAME;
                    dtxkzjcl.Rows.Add(dr);
                }

            }

            C1LineChart5.DataSource = dtzhkkl;
            C1.Web.Wijmo.Controls.C1Chart.C1ChartBinding cb = new C1.Web.Wijmo.Controls.C1Chart.C1ChartBinding();
            cb.XField = "REPORTHOUR";
            cb.YField = "DATA";
            C1LineChart5.DataBindings.Add(cb);
            C1LineChart5.DataBind();


            C1LineChart4.DataSource = dtxxzjpw;
            C1.Web.Wijmo.Controls.C1Chart.C1ChartBinding cb1 = new C1.Web.Wijmo.Controls.C1Chart.C1ChartBinding();
            cb1.XField = "REPORTHOUR";
            cb1.YField = "DATA";
            C1LineChart4.DataBindings.Add(cb1);
            C1LineChart4.DataBind();


            C1LineChart3.DataSource = dtxkzjcl;
            C1.Web.Wijmo.Controls.C1Chart.C1ChartBinding cb2 = new C1.Web.Wijmo.Controls.C1Chart.C1ChartBinding();
            cb2.XField = "REPORTHOUR";
            cb2.YField = "DATA";
            C1LineChart3.DataBindings.Add(cb2);
            C1LineChart3.DataBind();
        }
    }








将泛型集合转成对应datatable方法在网上找到了一个,测了一下也挺好用的,不用自己写了,就是利用反射技术。主要我们现在是用的三层架构+接口+工厂,我们往UI传递的都是含有实体类的泛型集合,再重新制作一个DATATABLE给控件,这样很奇怪。你们在研究研究吧,给点建议。

7 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2014-8-15 19:01:00
沙发
回复 1楼wanghaibo的帖子

还有另外一种方式显示泛型里面的数据。
我自己建立了一个List的数据,然后把这个数据给C1LineChart。
List如下所示:
  1.     public class MyReport:EntityDataSource
  2.     {
  3.         public string ReportName { get; set; }

  4.         public double[] REPORTHOUR { get; set; }
  5.         public double[] DATA { get; set; }
  6.     }
复制代码

  1. protected void Page_Load(object sender, EventArgs e)
  2.         {
  3. //创建数据
  4.             List<MyReport> allReports = new List<MyReport>();
  5.             MyReport report;
  6.             for (int i = 0; i < 3; i++)
  7.             {
  8.                 report = new MyReport();
  9.                 report.ReportName = "report" + i.ToString();
  10.                 report.REPORTHOUR = new double[] {0, 1,  2, 3, 4 };
  11.                 Random r = new Random();
  12.                 double y = r.Next(20+i);
  13.                 report.DATA = new double[] { y + i, y + i, y + i, y + 3, y + 4 };
  14.                 allReports.Add(report);
  15.             }

  16. //将数据在C1LineChart展示出来。
  17.             C1.Web.Wijmo.Controls.C1Chart.LineChartSeries s = null;

  18.             for (int i = 0; i < allReports.Count; i++)
  19.             {
  20.                 s = new C1.Web.Wijmo.Controls.C1Chart.LineChartSeries();
  21.                 s.Label = allReports[i].ReportName;
  22.                 s.Data.X.AddRange(allReports[i].REPORTHOUR);
  23.                 s.Data.Y.AddRange(allReports[i].DATA);
  24.                 this.C1LineChart1.SeriesList.Add(s);
  25.             }
  26.         }
复制代码


最后的样式如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
wanghaibo
论坛元老   /  发表于:2014-8-16 07:49:00
板凳
回复 2楼Alice的帖子

已经按照你的思路可以正产显示数据了,我们都不知道还有SeriesList这个属性,所以希望葡萄城能有个中文的文档,详细介绍每个控件的常用属性什么的,还有有一个中文的API文档,或者你将API的英文备注直接在程序里面汉化,这样我们看着也方便。还有个问题如下:
   C1.Web.Wijmo.Controls.C1Chart.LineChartSeries s = new C1.Web.Wijmo.Controls.C1Chart.LineChartSeries();
            for (int j = 0; j &lt; ListClass2Entity.Count; j++)
            {
                s.Data.X.Add(ListClass2Entity[j].REPORTHOUR);
                s.Data.Y.Add(ListClass2Entity[j].DATA);
                this.C1LineChart4.SeriesList.Add(s);
            }

用这种方式绑定数据的时候,每次循环集合的时候都会产生一个lable需要你给它赋值,问题是我现在只要一个lable.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-8-16 10:05:00
地板
回复 3楼wanghaibo的帖子

1.这是C1Chart的在线英文文档:http://helpcentral.componentone. ... entonelinechar.html
除此之外,我们还有中文的产品博客也可以作为开发参考:
http://blog.gcpowertools.com.cn/
谢谢你的反馈,目前Web版本还没有中文文档,我们也一直在提高产品质量和服务质量。不断的更新更多的资料给用户参考。
2.问题:你是指右边的Label么?
我看有12个Label。每个Series都会对应一个label,显示在图上就是一条线会有一个标签说明这条线。SeriesList里是所有的Series的集合。从图上看,你的ListClass2Entity.Count是12个,但线只有一条。我需要更多的信息帮你解决问题,请查看是不是你没有清空SeriesList?每个ListClassEntity下是否有数据,还是数据都一样的?
如果有问题,希望能够把ListClassEntity数据源提供给我。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
wanghaibo
论坛元老   /  发表于:2014-8-16 14:55:00
5#
回复 4楼Alice的帖子


Alice我觉得是这样的,首先是每个 C1.Web.Wijmo.Controls.C1Chart.LineChartSeries对象对应一条曲线这是对的,通过观察程序可知你在每次循环的时候new了一个对象,你一共New了3次,你有3条曲线;而我在循环外边new了1次,所以我有1条曲线。
那为什么你是3条曲线对应3个lable呢?因为你this.C1LineChart1.SeriesList泛型集合中,有3个对象(元素)。而我的this.C1LineChart1.SeriesList泛型集合中只用一个对象,就是我在循环外面new的。

由此可猜想,当控件获取最终形成的泛型集合时,它在UI上呈现的lable数量为SeriesList泛型集合中的元素的数量。


下面回到我的程序,那为什么我在循环外new,而不是每次循环都新new一个C1Chart.LineChartSeries对象对象呢,是由于业务要求,我就是要一条曲线,我会往UI传递一个泛型集合,这个泛型集合回有很多元素,每一个元素是一个实体类对象。然后我循环遍历这个泛型集合,然后将C1.Web.Wijmo.Controls.C1Chart.LineChartSeries对象放到C1LineChart4.SeriesList泛型集合中



你的ListClass2Entity.Count是12个,但线只有一条??????------确实应该一条啊,跟ListClass2Entity.Count无关啊!!!
请查看是不是你没有清空SeriesList?--------为什么要清空SeriesList,清空了,控件获取啥啊???
每个ListClassEntity下是否有数据,还是数据都一样的?-------有数据,数据时不一样的!!
你是指右边的Label么?--------是的
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-8-16 15:37:00
6#
回复 5楼wanghaibo的帖子

现在我理解了你的需求,你需要把所有的数据用一条线展示出来。

循环里写了这句代码:this.C1LineChart4.SeriesList.Add(s);
它被执行了12次,所以实际上SeriesList有12个系列,这个可以通过this.C1LineChart4.SeriesList.Count去获取,这个数字应该不是1。Label是按Series生成的,自然有12个Label。

解决的方法:将this.C1LineChart4.SeriesList.Add(s);这句代码移到For循环外执行。就可以生成一条线和一个Label。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
wanghaibo
论坛元老   /  发表于:2014-8-16 16:29:00
7#
回复 6楼Alice的帖子

原来机制是这样子的,明白了,问题已经解决了,谢谢
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-8-18 09:31:00
8#
回复 7楼wanghaibo的帖子

问题解决就好,有问题欢迎开新帖交流。

评分

参与人数 1满意度 +5 收起 理由
wanghaibo + 5 我很赞同

查看全部评分

请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部