好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Winform开发框架之数据曲线报表

Winform开发框架之数据曲线报表

在项目开发中,往往会碰到一些非常规的需求,每次碰到这种情况,都需要花费时间来整理自己的思路,然后参考网络上其他人的实现方式或者作法,有时候可以找到一些相同的模块进行改进即可符合需求,但往往很多是需要自己潜心研究,然后提炼优化,虽然探索过程还是比较开心,不过时间肯定是需要花不少的。我每次碰到这种情况,都会沉下心来,力求把这种的模块做得更好一点,方便以后的重用,这样每次抱着这样的态度,着实积累了不少好的东西,也可以为后面的项目夯实基础。

在一次Winform的项目开发过程中,客户需要对一些体检数据等参数进行曲线展示,其实图表控件有很多,但是我印象比较深的还是开源的 ZedGraph控件 ,这个既可以用在Web上,也可以用在Winform上的开源控件,有着简单易用的特点,因此我会先考虑是否可以满足要求。在需求中,我需要定制显示曲线报表的内容,按照每行一个人员的数据,然后再每行中展现该人员的相关图表信息,而且这种的报表要可以实现打印的功能。在经过一段时间的摸索及实现提炼,得到了比较满意的效果,先来进行总体的介绍先把。

通过把好的思路,有用的技巧进行积累整合到Winform开发框架中,方便自己,也方便别人,提高工作效率。

1、按每行一个用户的数据显示曲线报表图形

一行一个人员的曲线数据,可以对同一曲线项目进行对比,方便用户的实际业务对比操作。

2、每个曲线图形可以双击打开,进行放大缩小的操作,方便用户查看。

由于在一个界面中展示多个图表图形的时候,会比较小,为了更直观显示曲线数据,可以通过单独打开一个新的窗口进行曲线缩放操作,支持鼠标的滚动放大缩小,同时 ZedGraph 支持绘图点的信息提示,非常友好。

3、提供自定义打印及文档导出功能

由于用户控件是自定义组装的,因此要实现自定义的打印功能才可以,这个自定义打印的东西确实需要慢慢测试研究,这个地方花了不少时间。

通过在DevExpress打印界面中展示预览效果,方便可以进行打印确认操作,以及预览最终的效果,并支持把文档导出到PDF或者图片中,非常方便易用。

以上就是这个曲线报表的主要几个特点,不过这样的曲线,基本上能够满足我们日常的一些数据曲线的展现的了。

实现上我们需要把需求和界面拆分,首先我们在一个设计主界面,在住界面上防止一个TableLayout的布局控件,方便我们动态添加每个单一的控件进去。

4、曲线报表具体实现过程及思路 1)设计报表显示主界面

2)设计曲线报表组件

然后设计一个空白的布局FlowLayout控件,用来摆放一个或者多个的曲线报表项目,例如体重曲线、视力曲线、血压曲线等项目的,实现代码如下所示。

         public   void   BindData()
        {  
             switch   (CurveData.CurveType)
            {
                  case   CurveType.体重:
                    BindWeight();
                      break  ;
                 case   CurveType.身长:
                   BindHeight();
                     break  ;
                  case   CurveType.脉搏:
                    BindPulse();
                      break  ;
                  case   CurveType.血压:
                    BindBlood();
                      break  ;
                  case   CurveType.视力:
                    BindSight();
                      break  ;
                 case   CurveType.暗适应时间:
                    BindDarkAdapTime();
                      break  ;
                  case   CurveType.体温:
                    BindTemperature();
                      break  ;
                  case   CurveType.全部:
                      #region  全部
                     if  (CurveData.CheckType ==  CheckType.季度小体检)
                    {
                        BindWeight();
                        BindPulse();
                        BindBlood();
                        BindSight();
                        BindDarkAdapTime();
                    }
                      else   if  (CurveData.CheckType ==  CheckType.年度大体检)
                    {
                        BindWeight();
                        BindHeight();
                        BindPulse();
                        BindBlood();
                        BindSight();
                    }
                      else   if  (CurveData.CheckType ==  CheckType.飞行前体检)
                    {
                        BindTemperature();
                        BindPulse();
                        BindBlood();
                    }                     
                      break  ;

                      #endregion  
            }
        } 

         private   void   BindWeight()
        {
            DataTable dt  =  null  ;
              if  (CurveData.CheckType ==  CheckType.年度大体检)
            {
                dt  = BLLFactory<LargeCheckSurgical> .Instance.GetWeightData(CurveData.StartDate,
                    CurveData.EndDate, CurveData.PilotID);
            }
              else   if  (CurveData.CheckType ==  CheckType.季度小体检)
            {
                dt  = BLLFactory<SmallCheck> .Instance.GetWeightData(CurveData.StartDate,
                    CurveData.EndDate, CurveData.PilotID);
            }

            WeightCurve curve  =  new   WeightCurve();
            curve.CurveData  =  CurveData;
            curve.dataTable  =  dt;
              this  .layoutPanel1.Controls.Add(curve);
        } 

其他代码不在赘述。

3)设计曲线项目组件

由于曲线报表涉及很多展示的项目,每项又有一些不同,因此我们为不同的项目设计一个组件,如体重曲线如下所示,在一个自定义控件上面放置一个 ZedGraph 组件,设计好这个组件的相关属性和事件。

这个控件默认是英文的,所以如果需要使用中文菜单,需要自己汉化一下代码,然后编译出来自己使用即可。

实现代码如下所示

            GraphPane myPane =  zgc.GraphPane;
            myPane.CurveList.Clear();

              //   设置标题及坐标轴的说明 
            myPane.Title.Text =  string .Format( "  【{0}】体重曲线  "  , CurveData.PilotName);
            myPane.XAxis.Title.Text  =  "  体检日期  "  ;
            myPane.YAxis.Title.Text  =  "  体重(Kg)  "  ;

            PointPairList list  =  new   PointPairList();
              foreach (DataRow row  in   dataTable.Rows)
            {
                DateTime checkDate  = Convert.ToDateTime(row[ "  CheckDate  "  ].ToString());
                  double  x = ( double )  new   XDate(checkDate);
                  double  y = Convert.ToInt32(row[ "  Weight  "  ].ToString());

                list.Add(x, y);
            }

            LineItem myCurve  = myPane.AddCurve( "  体重  "  , list, Color.Red, SymbolType.Diamond);
            myCurve.Symbol.Fill  =  new  Fill(Color.White);

4)设计图表打印模块

打印的时候,需要自己在打印原件上进行图形的绘制,这一个是比较复杂的调试过程,开始总是想着是否可以把控件打印出来就OK,可是这种操作,一旦界面遮挡,就打印不出实际的效果了,所以只好类似绘图一样,使用自定义绘制方式。

这样我计算好每个控件的大小尺寸(包括Lable控件、曲线图表控件),然后挨着绘制即可,主要代码如下所示。

         protected   virtual   void  DrawRow(BrickGraphics graph,  int  rowIndex,  int  col, Control ctrl,  float   left)
        {
            graph.BackColor  =  Color.White;

            RectangleF bounds  =  new  RectangleF(left,  0  , ctrl.Width, ctrl.Height);
            bounds.Y  = (rowIndex -  1 ) *  bounds.Height;

              if  (ctrl  is   Label)
            {
                TextBrick brick  =  graph.DrawString(ctrl.Text, bounds);
                brick.HorzAlignment  =  DevExpress.Utils.HorzAlignment.Center;
                brick.VertAlignment  =  DevExpress.Utils.VertAlignment.Center;
                  const   int  LeftPadding =  4  ;
                brick.Padding  =  new   PaddingInfo(LeftPadding, brick.Padding.Right, brick.Padding.Top, brick.Padding.Bottom);
            }
              else  
            {
                  int  width =  ctrl.Size.Width;
                  int  height =  ctrl.Size.Height;
                Bitmap bm  =  new   Bitmap(width, height);
                ctrl.DrawToBitmap(bm,   new  Rectangle( 0 ,  0  , width, height));

                ImageBrick brick  =  graph.DrawImage(bm, bounds);
                brick.SizeMode  =  ImageSizeMode.ZoomImage;
            }
        } 

好了,整个曲线报表的显示效果及实现思路及部分核心代码,都已经介绍完毕了,在整个过程中,除了经验外,我觉得最重要的就是要细心、耐心及用心,项目开发就是把各种技巧、各种思路都集中起来,才可以快速高效的开发出高质量、客户反映好的项目出来。

主要研究技术:代码生成工具、Visio二次开发、送水管理软件等共享软件开发
专注于 Winform开发框架 、WCF开发框架的研究及应用。
  转载请注明出处:
撰写人:伍华聪   http://www.iqidi.com  
    

 

标签:  Winform开发框架

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于Winform开发框架之数据曲线报表的详细内容...

  阅读:41次