Winform开发框架之数据曲线报表_weixin_34342905的博客-程序员秘密

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

在一次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;
            }
        }

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34342905/article/details/85513622

智能推荐

sap代码 ABAP_程序sapkka07_nongcunqq的博客-程序员秘密

* P30E_AV (P30K075924): Arbeitsvorrat-Exitroutine eingebaut* P30E_PAR (P30K081591/3.0E): Parallelisierung* 30F_LÖVM (P30K090659/3.0F): Aufträge mit LÖVM nicht berücksichtigen* 30F_CHK (P30K090659/3.0F): Meldung für Aufträge 'falschen' Typs* 30F_STOR (

HDU1264、1280、1425、1496、1800(简单哈希练习)_migd145哈希_大白QQly成长日记的博客-程序员秘密

Counting Squares Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2439    Accepted Submission(s): 1184  Problem DescriptionYour inpu...

HTML转图片_不净之心的博客-程序员秘密

[color=red][b]PhantomJS[/b][/color]NodeJS + PhantomJS 抓取页面信息以及截图 [url]http://www.cnblogs.com/justany/p/3279717.html[/url]PhantomJS1.7 API [url]http://www.cnblogs.com/ziyunfei/archive/2012/09/28/27...

56.Linux环境搭建--开发板端_setenv bootarg_lzs_blog的博客-程序员秘密

上节完成了平台端的环境搭建,我们的开发板端也要安装相应的服务。一.首先说一下我们开发板的启动流程:bootloader 初始化硬件,然后加载内核 kernel 然后挂接根文件系统,然后启动我们的应用程序。二.当然第一步是要下载我们的bootloader,可以使用j-link等进行烧写(不同板卡烧写方式不同),一般我们使用SD卡的方式进行烧写,SD卡需要制作成启动卡,制作方法可以百度。将我们的bootloader放入SD卡中,关闭开发板电源,将拨码开关SW1调至(1000)(SD启动.

Android开发error: java.lang.NullPointerExceptio_sopho没有more的博客-程序员秘密

这个是我遇到的错误Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.widget.ImageView.getWidth()' on a null object reference造成该错误的源码int targetW = mImageView.getWidth();mIma

随记13:echarts 修改图例legend颜色及形状_echarts legend 颜色 形状_ChenMoJie_的博客-程序员秘密

echarts 修改图例legend颜色及形状ECharts 提供图例项的 icon有:‘circle’, ‘rect’, ‘roundRect’, ‘triangle’, ‘diamond’, ‘pin’, ‘arrow’, ‘none’图例颜色依次放入数组中即可

随便推点

网卡82583V在win2008上装驱动问题_英特尔82583v网卡驱动_Lyric_Lu的博客-程序员秘密

关于82583V网卡驱动在win2008的安装步骤在设备管理器中选择未安装上的网卡,点击右键“更新驱动程序软件”在弹出的“更新驱动程序软件”的对话框中选“浏览计算机以查找驱动程序软件”。 接着选“从计算机的设备驱动程序列表中选择”。在“从以下列表选择设备的类型”列表中找到并选中“网络适配器”,点击下一步。在“选择网络适配器”中,选择厂商“Intel”,选择网络适配器...

[20190125]bbed恢复数据遇到延迟块清除的问题3.txt_cuixun7780的博客-程序员秘密

[20190125]bbed恢复数据遇到延迟块清除的问题3.txt--//昨天分别做了2个测试,链接:http://blog.itpub.net/267265/...

Win10开机弹出msn中文网该怎么取消?取消开机弹出msn导航的方法_weixin_34248487的博客-程序员秘密

转载来自:系统盒  有用户在刚升级的Windows 10系统中遇到了问题,每次开机都会弹出msn中文网的导航网址,该怎么办呢?出现这样的情况是win10系统中一个小小的设定问题,我们可以按一下方法修改注册表即可解决。打开注册表编辑器HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet...

学python买什么书-想学python看哪些书_编程大乐趣的博客-程序员秘密

在过去一年里,Python的热度一路飙升,国内越来越多的人选择学习Python,如今已然成为大量开发者推荐的入门编程语言和第二编程语言,而且Python还是人工智能的主要编程语言,因此,其重要性和流行度也就不言而喻了。更多关于Python学习方面的知识,可以参考这篇文章:《Python学习的49个必备资源(附链接)》想要学好Python语言,需要了解Python是什么,都能够做什么,知道算法,变量...

MongoDB 副本集自动复制 Replica Set_Fens的博客-程序员秘密

MongoDB部署实验系列文章,MongoDB做为NoSQL数据库,最近几年持续升温,越来越多的企业都开始尝试用MongoDB代替原有Database做一些事情。MongoDB也在集群,分片,复制上也有相当不错的的表现。我通过将做各种MongoDB的部署实验进行介绍。关于作者:张丹(Conan), 程序员Java,R,PHP,Java...

java后台封装echarts_李秀才的博客-程序员秘密

前些日子用到了Echarts,觉得比之前用的funshioncharts好用太多!可是拼装数据到前台显示的时候,有点费时费力,于是对Echarts在后台做了封装。具体做法了抽象出众图类、零件之上用零件组装成组件(坐标轴、标题、提示、图例、值域漫游、工具箱、数据项之类),组件之上抽象出图类(柱状图、折线图、饼图、仪表盘、地图、漏斗图之类),然后根据这些图类在图形工厂里灵活组装代码生成整个option

推荐文章

热门文章

相关标签