金喜正规买球

在WinForm中使用Visifire实现统计图表功能

转帖|其它|编辑:郝浩|2011-11-22 13:58:55.000|阅读 2386 次

概述:简单的说Visifire是一组可视化数据控件集合,主要用在WPF、Sliverlight、WP7应用程序中,只需要编写简单的代码就能轻松实现比较绚丽的图表功能,包括3D效果。今天我们将借助该控件在WinForm中借助xaml来实现统计图表功能。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

  简单的说Visifire是一组可视化数据控件集合,主要用在WPF、Sliverlight、WP7应用程序中,只需要编写简单的代码就能轻松实现比较绚丽的图表功能,包括3D效果。今天我们将借助该控件在WinForm中借助xaml来实现统计图表功能。

  下面我们通过两个例子来看看如何在编写少量代码的前提下,实现统计图表中最常见的直方图、折线图功能。按照常规,还是先预览一下效果吧:

图一:单一数据统计2D效果

图二:单一数据统计3D效果

图三:折线图效果 

图四:两组数据对比的3D效果

  图一二三是一个页面实现的不同方式,图四用于对比统计。

  下面看看图具体实现:

  第一步:创建一个xmal (WPF用户控件)

  需要给默认代码中的Grid加个x:Name属性,其实就是ID了,用户图表承载作用。

  <UserControl x:Class="CHVM.Statistics.ACS"

      xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation"

  &nbsp;   xmlns:x="//schemas.microsoft.com/winfx/2006/xaml"

      Height="300" Width=&quot;300">

      <Grid x:Name="canvas1">           

      </Grid>

  </UserControl>

  然后就是写其交换代码(后台代码xaml.cs)

        ;  /// <summary>

   &nbsp;      /// 数据源  共三列:XValue,YValue

        &nbsp; /// </summary>

          public DataTable DtChartData

          {

  &nbsp;  &nbsp;        get;

  &nbsp;         &nbsp; set;

          }

  &nbsp;       /// <summary>

   ;       /// 创建图表

          /// <param name="type">图表类型(Line:折线图  Column:直方图)</param>

          /// </summary>

          public void CreateChart(string type)

          {

     &nbsp;        if (type=="Line")

         &nbsp;    {

       ;        &nbsp;  LineChart();

            ;  }

          &nbsp;   else if(type=="Column")

              {

         &nbsp;        ColumnChart();

     &nbsp;        }

     &nbsp;      &nbsp; else

              {

     &nbsp;            MessageBox.Show("创建图表时,类型传值错误!");

   &nbsp;          }

          }

  &nbsp;       /// <summary>

      &nbsp;   /// 折线图

   &nbsp;      /// </summary>

    &nbsp;     private void LineChart()

          {

             ; Chart chart = new Chart();

          &nbsp;   //chart.View3D = true;

  &nbsp;           Title title = new Title();

              title.Text = "串并统计";

           &nbsp;  chart.Titles.Add(title);

    &nbsp;      &nbsp;  DataSeries dataSeries = new DataSeries();

  &nbsp;           dataSeries.RenderAs = RenderAs.Line;//折线图

              dataSeries.LabelEnabled = true;

       &nbsp;      dataSeries.LabelStyle = LabelStyles.OutSide;

  &nbsp;           DataPoint dataPoint;

              for (int i = 0; i < DtChartData.Rows.Count; i++)

            &nbsp; {

   &nbsp;              dataPoint = new DataPoint();

            &nbsp; &nbsp;   dataPoint.AxisXLabel = DtChartData.Rows[i]["XValue"].ToString();

        ;          dataPoint.YValue = Convert.ToDouble(DtChartData.Rows[i]["YValue"]);

       &nbsp;          dataSeries.DataPoints.Add(dataPoint);

          &nbsp;   }

           &nbsp;  chart.Series.Add(dataSeries);

          &nbsp; ;  canvas1.Children.Add(chart);

          }

        &nbsp; /// <summary>

  &nbsp;    &nbsp;  /// 直方图

          /// </summary>

      &nbsp;   private void ColumnChart()

          {

              Chart chart = new Chart();

    &nbsp;         chart.View3D = true;

            &nbsp; Title title = new Title();

      &nbsp;       title.Text = "串并统计";

      &nbsp;       chart.Titles.Add(title);

   &nbsp;          DataSeries dataSeries = new DataSeries();

    &nbsp;         dataSeries.LabelEnabled = true;

              dataSeries.LabelStyle = LabelStyles.OutSide;

      &nbsp;       dataSeries.RenderAs = RenderAs.Column;

           ;&nbsp;  DataPoint dataPoint;

              for (int i = 0; i &lt; DtChartData.Rows.Count; i++)

          &nbsp;   {

                  dataPoint = new DataPoint();

                  dataPoint.AxisXLabel = DtChartData.Rows[i]["XValue"].ToString();

                  dataPoint.YValue = Convert.ToDouble(DtChartData.Rows[i]["YValue"]);

                  dataSeries.DataPoints.Add(dataPoint);

         &nbsp;    }

   &nbsp;&nbsp;         chart.Series.Add(dataSeries);

            &nbsp; canvas1.Children.Add(chart);

          }

  这里公开了数据源DtChartData(DataTable类型),和一个CreateChart()方法,参数为创建图表的类型。到这里xmal就算完成了。

  第二步:创建一个Windows窗体,用于承载xaml,布局如下图所示

  后台代码:

     public partial class ACSStatistics : Form

      {

   &nbsp;    &nbsp; ACS chart;

        &nbsp; string ChartType = "Column"; //显示图像类别Line or Column

        &nbsp; int XValueType = 1; //1:按月统计 2:按年统计

   &nbsp;      public ACSStatistics()

          {

            &nbsp; InitializeComponent();

          &nbsp;&nbsp;  dtEnd.Value = DateTime.Now;

   &nbsp;      ;    dtBegin.Value = DateTime.Now.AddMonths(-6);

    &nbsp;      &nbsp;  chart = new ACS();

      ;        ElementHost elHost = new ElementHost();

           &nbsp;  elHost.Dock = DockStyle.None;

        &nbsp;     elHost.Width = pnlChart.Width;

   &nbsp;          elHost.Height = pnlChart.Height;

           &nbsp;&nbsp; elHost.Child = chart;

           &nbsp;  pnlChart.Controls.Add(elHost);

              chart.DtChartData = GetData(1);

       &nbsp;&nbsp;     chart.CreateChart("Column");

              if (chart.DtChartData.Rows.Count == 0)

       &nbsp;      {

                  MessageBox.Show("没有数据统计", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

              }

          }

   

          /// <;summary>

   &nbsp;      /// 查询数据

      &nbsp;   /// </summary&gt;

          /// <param name="type">1:按月统计 2:按年统计</param>

   &nbsp;      /// <returns></returns>

   ;       private DataTable GetData(int type)

          {

              string strWhere = string.Format(" where  T.ACSTIME>='{0}' and  T.ACSTIME<='{1}'", dtBegin.Value.ToString("yyyy-MM-dd HH:mm:ss"), dtEnd.Value.ToString("yyyy-MM-dd HH:mm:ss"));

    ;          DataTable dt;

              if (type==1)

  &nbsp;           {

        &nbsp;         string strSql = string.Format(@" select concat(concat(A.InYear,'年'),concat(A.InMonth,'月')) as XValue, A.*,count(A.InMonth)as YValue from (

   select  SUBSTR(T.ACSTIME,1,4) as InYear,SUBSTR(T.ACSTIME,6,2) as InMonth  from TACS T  {0})A

   group by InYear,InMonth ", strWhere);

    ;              dt = DataCon.Query(strSql).Tables[0];

           &nbsp;      return dt;

    &nbsp;         }

         &nbsp;    else if (type == 2)

            &nbsp; {

          ;        string strSql = string.Format(@"select concat(A.InYear,'年') as XValue,count(A.InYear)as YValue from (

  select SUBSTR(T.ACSTIME,1,4) as InYear  from TACS T {0})A group by InYear ", strWhere);

       &nbsp;      &nbsp;   dt = DataCon.Query(strSql).Tables[0];

      &nbsp;           return dt;

        &nbsp;     }

          ;    else

   &nbsp;   ;       {

               &nbsp;  return new DataTable();

  &nbsp;    &nbsp;      }

          }

  &nbsp;       /// <summary>

        &nbsp; /// 直方图

  &nbsp;       /// </summary>

          /// <param name="sender"></param>

          /// <param name="e"></param>

  &nbsp;       private void btnColumnChart_Click(object sender, EventArgs e)

          {

      &nbsp;     &nbsp; ChartType = "Column";

              chart.DtChartData = GetData(XValueType);

              chart.CreateChart(ChartType);

              if (chart.DtChartData.Rows.Count == 0)

              {

                  MessageBox.Show("没有数据统计", "提示";, MessageBoxButtons.OK, MessageBoxIcon.Information);

    &nbsp;         }  

          }

  &nbsp;       /// <summary>

          /// 折线图

          /// <;/summary>

       ;   /// <param name="sender"></param>

          /// &lt;param name="e"></param>

          private void btnLineChart_Click(object sender, EventArgs e)

          {

              ChartType = "Line";

    &nbsp;         chart.DtChartData = GetData(XValueType);

  &nbsp;           chart.CreateChart(ChartType);

              if (chart.DtChartData.Rows.Count == 0)

      &nbsp;       {

               &nbsp;  MessageBox.Show("没有数据统计", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

        &nbsp;     }    &nbsp;

          }

          private void comboXValueType_SelectedIndexChanged(object sender, EventArgs e)

          {

    ;        ;  if (comboXValueType.Text=="按月统计")

     ;         {

              &nbsp;   XValueType = 1;

        &nbsp;     }

       ; &nbsp;     else

       ;       {

         ;         XValueType = 2;

  &nbsp;           }

         &nbsp;    if (ChartType=="Column")

         &nbsp;  &nbsp; {

                  btnColumnChart_Click(btnColumnChart, e);

         &nbsp;    }

   ;     ;      else if(ChartType=="Line")

              {

      &nbsp;           btnLineChart_Click(btnLineChart, e);

          &nbsp;   }

          }

  }

   

  简单说明:在构造函数中设置默认统计为六个月的数据,GetData()方法直接查询数据库(这里是简单实现演示效果,如果代码想分多层的话自己去处理,这个我在这就讲解了)得到DataTable格式的数据,PL-SQL直接查询Oracles数据库效果如下所示:

  做统计的时候,重点就是会能用Group By语句了。里面根据统计的方式分为按年按月统计两种,下面是图一二三按年统计的效果:

  只有2011年有数据。

  例子二:图四的实现过程

  其他的不讲了,大部分而例子一是一样的,这里提一下不相同的部分:

  一是数据源: 变成三列的要求了,因为我们是对比,所以X值相同,Y值有两个       

  /// <summary>

          /// 数据源  共三列:XValue,YValue1,YValue2

    &nbsp;     /// </summary>

    ;      public DataTable DtChartData

          {

       &nbsp;     ; get;

   &nbsp;        ;  set;

          }

  二是创建图表的方法多了一个循环,循环次数为2,因为我们对比的Y值只有两个,如果是多个,多次循环就行了

     ;     /// <summary>

   &nbsp;      /// 创建图表

          /// </summary>

    &nbsp;     public void CreateChart()

          {

      &nbsp;       Chart chart = new Chart();

            &nbsp; chart.View3D = true;

              Title title = new Title();

            &nbsp; title.Text = "案件统计";

         &nbsp;    chart.Titles.Add(title);

    &nbsp;         //Axis axis = new Axis();

              //axis.IntervalType = IntervalTypes.Months;

         &nbsp; &nbsp;  //axis.Interval = 20;

      &nbsp;  ;     //chart.AxesX.Add(axis);

  &nbsp;           for( int j=0;j<2;j++)

     &nbsp;      &nbsp; {

             ;     DataSeries dataSeries = new DataSeries();

       ;&nbsp;          dataSeries.LabelEnabled = true;

         &nbsp;  &nbsp;     dataSeries.LabelStyle = LabelStyles.OutSide;

                  if (j==0)

        &nbsp;         {

                   ;   dataSeries.Name = "案件总数";

            &nbsp;     }

                  else

  &nbsp;        &nbsp;      {

        &nbsp;             dataSeries.Name = "已破案件";

               &nbsp;  }

                  dataSeries.RenderAs = RenderAs.Column;

                //  dataSeries.XValueType = ChartValueTypes.Auto;

          &nbsp; ;      DataPoint dataPoint ;

  &nbsp;              for(int i=0;i<DtChartData.Rows.Count;i++)

       &nbsp;         {

                     dataPoint = new DataPoint();

                     dataPoint.AxisXLabel = DtChartData.Rows[i]["XValue"].ToString();

                     if (j==0)

          &nbsp;          {

                         dataPoint.YValue = Convert.ToDouble(DtChartData.Rows[i]["YValue1"]);

        ;             }

           &nbsp;         else

        &nbsp;            {

   &nbsp;              &nbsp;      dataPoint.YValue = Convert.ToDouble(DtChartData.Rows[i]["YValue2"]);

           &nbsp;         }

                     dataSeries.DataPoints.Add(dataPoint);

      &nbsp;          }

            &nbsp;    chart.Series.Add(dataSeries);

          &nbsp;   }

         &nbsp;    canvas1.Children.Add(chart);

          }

  Winform的后台代码和例子一类似,其实就是获取数据源,不管使用什么方式都可以。

  用Visifire实现统计图表效果是不是很简单,很方便呢?呵呵,至少我是这么觉得的!

  如果认为直方图和折线图太平常了,希望创建其他图形如:饼状图、雷达图等等,自己去看API吧,也就是RenderAs的枚举值,方法和属性的适用范围不同而已!我们也Overview一下吧:


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@fc6vip.cn

文章转载自:网络转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP