艾伟也谈项目管理,项目过程中所遇到的各种问题记录——有关MSChart的一些小技巧

简介: 完成了有关编辑器篇的内容,接下来记录下这一年里在有关图表使用过程中碰到的一些问题及个人的解决方法。  以下是本文所要介绍的内容:1、MSChart基本概况介绍。2、开发过程中碰到的问题及解决方法。

      完成了有关编辑器篇的内容,接下来记录下这一年里在有关图表使用过程中碰到的一些问题及个人的解决方法。

  以下是本文所要介绍的内容:

1、MSChart基本概况介绍。

2、开发过程中碰到的问题及解决方法。

  一、MSChart基本概况介绍

       在开发一些管理系统的时候总会碰到一些需求需要对报表进行图形化的展示——图表,在微软的MSChart没出来前.NET的winforms下许多的图表控件不是要收费就是可使用的图表类型较少或者各种资料太少(也可能是我了解的太少),不过自从在VS2008上微软推出了MSChart后,在winforms上进行图表统计就方便了很多很多。

        MSChart分为2个部分,一个是winforms版本,另一个是webform版,并且都提供了相应的示例程序(超过200个示例代码,并包括C#版本和VB.NET版本,其中内置了多种图表类型,基本上涵盖了各行各业的所需的图表类型),使得开发者可以根据需求快速的找到自己所需的图表类型,同时查看示例代码可以马上上手进行开发,如下图:

pic89

当然本文不是介绍MSChart的具体是如何使用的,上面仅仅是对MSChart进行各简单性的介绍,本文主要介绍的内容还是在我开发过程中碰到问题。

  二、开发过程中碰到的问题及解决方法

  现在开始介绍下我所碰到的几个问题:

  1、如果在对于统计的类别数量不可数的情况下,如何解决生成的每个类别有不同的列?

  在公司年初开发的一个winforms程序中需要对用户自己定义的分类数据进行统计,而用户所创建的分类数量又是不定的(但不能超过10个),这时就碰到个问题:就是MSChart图表中的列如果想做的好看,吸引眼球需要进行大量的配置,比如:列的颜色、边框宽度、阴影等等,而每个用户建立的分类对应着一个列,本来的设想是根据数量动态生成对应的列,但是在实际的开发过程中,如果要保证每个列的样式达到统一,且颜色等又要区分的话,使用代码来动态生成太过于复杂。

我就想到了个不是办法的办法,就是由于用户自定义的分类是不可能超过10个的,所以我就事先在图标中建立好了10个列,根据用户建立的分类数量来对这些已经建立好的列进行数据填充,而那些没有填充数据的列就不会出现,这样的解决办法虽然比较的傻,但是实际的效果很不错,毕竟动态创建的列要保证样式统一需要花时间调试,而且不像直接通过配置创建出来的列那么直观,见下图:

pic90

  2、实现类似于CNZZ流量统计形式的点选分类突出显示

  使用过CNZZ统计的朋友肯定知道,CNZZ对访问者的来源统计展示形式是一个饼状展示的,同时通过某块区域时可以突出显示这个区域,如下图:

pic91

  可以看到,我通过点击【江苏省】,将这块区域突出显示了,这个功能虽然不起眼,但是在实际公司的使用过程中,比如开会的时候有针对性的介绍某块内容的时候就会使用到,而如果在winforms下使用MSChart如何实现呢?如果想通过MSChart实现这样的效果就需要数据列中具体值(DataPoint)的CustomProperties来实现,代码如下(VB.NET

 
  
private void chartPerformance_MouseDown( object sender, System.Windows.Forms.MouseEventArgs e)
{
HitTestResult result
= chartPerformance.HitTest(e.X, e.Y);

if (result.PointIndex == - 1 ) {
return ;
}

bool exploded
= (chartPerformance.Series( 0 ).Points(result.PointIndex).CustomProperties == " Exploded=true " ? true : false );

DataPoint point
= default (DataPoint);
foreach ( point
in chartPerformance.Series( 0 ).Points) {
point.CustomProperties
= "" ;
}

if (exploded) {
return ;
}
// 点击具体列
if (result.ChartElementType == ChartElementType.DataPoint) {
DataPoint dPoint
= chartPerformance.Series( 0 ).Points(result.PointIndex);
dPoint.CustomProperties
= " Exploded = true " ;
if (((List < ModelClass > )dPoint.Tag).Count == 0 ) {
return ;
}
}
// 点击图例
if (result.ChartElementType == ChartElementType.LegendItem) {
DataPoint dPoint
= chartPerformance.Series( 0 ).Points(result.PointIndex);
dPoint.CustomProperties
= " Exploded = true " ;
if (((List < ModelClass > )dPoint.Tag).Count == 0 ) {
return ;
}
}
}

  这段代码的主要步骤是:

1、为图表控件增加一个MouseDown事件

2、获取图表控件当前点击的坐标,并判断是否存在

3、判断点击的对象是具体的列还是图例,然后为点击的图例增加相应的属性:CustomProperties = "Exploded = true";

  具体的效果如下:

pic92

  可以看到图表中,【优】列已经被分离突出显示了。此时我们还可以为这个表增加一些类似于网页开发中的MouseOver、MouseLeave效果,以达到更好的用户体验,如下图:

pic93

  可以看到图片上【中】列和图例上的上面明显有一层格子状网线,这样可以告诉使用者当先所选的列,实现代码如下:

 
  
private void chartPerformance_MouseMove(System.Object sender, System.Windows.Forms.MouseEventArgs e)
{
HitTestResult result
= chartPerformance.HitTest(e.X, e.Y);

if (result == null) {
return ;
}

DataPoint point
= default (DataPoint);
foreach ( point
in chartPerformance.Series( 0 ).Points) {
point.BackSecondaryColor
= Color.Black;
point.BackHatchStyle
= ChartHatchStyle.None;
point.BorderWidth
= 1 ;
}

if (result.ChartElementType == ChartElementType.DataPoint | result.ChartElementType == ChartElementType.LegendItem) {
this.Cursor
= Cursors.Hand;

DataPoint dPoint
= chartPerformance.Series( 0 ).Points(result.PointIndex);

dPoint.BackSecondaryColor
= Color.White;

dPoint.BackHatchStyle
= ChartHatchStyle.Percent25;

dPoint.BorderWidth
= 2 ;
}
else {
this.Cursor
= Cursors.Default;
}
}

  这段代码的实现步骤是:

1、获取当前点击的坐标。

2、遍历所有具体的点及图例为其增加一个背景样式,及鼠标手势。

目录
相关文章
|
存储 Apache
Apache Hudi Savepoint实现分析
Apache Hudi Savepoint实现分析
248 0
|
前端开发 JavaScript API
生成订单前端页面整合(1) | 学习笔记
快速学习 生成订单前端页面整合(1)
445 0
生成订单前端页面整合(1) | 学习笔记
|
5月前
|
安全 IDE 开发工具
HarmonyOS实战:解决模拟器启动失败问题
本文介绍了在Windows系统上安装HarmonyOS开发环境时遇到的模拟器启动失败问题及解决方案。为应对鸿蒙可能脱离安卓阵营,开发者需学习HarmonyOS。华为提供的IDE与Android Studio相似,降低了学习成本。但创建鸿蒙模拟器时可能出现报错,官方方案无效时,可通过打开Windows安全中心的“内核隔离”并开启“内存完整性”解决。文章还鼓励初学者收藏内容,并在学习中交流问题。
392 1
HarmonyOS实战:解决模拟器启动失败问题
|
机器学习/深度学习 人工智能 自动驾驶
【人工智能】图像识别:计算机视觉领域的识别与处理资源概览
在快速发展的科技时代,计算机视觉(Computer Vision, CV)作为人工智能的一个重要分支,正深刻改变着我们的生活与工作方式。图像识别作为计算机视觉的核心任务之一,旨在让机器能够理解和解释数字图像或视频中的内容,进而执行诸如目标检测、图像分类、场景理解等复杂任务。本文将深入探讨图像识别领域的关键技术、常用数据集、开源框架及工具资源,为从事或关注该领域的专业人士提供一份全面的指南。
482 2
|
人工智能 IDE Java
AI 代码工具大揭秘:提高编程效率的必备神器!
【10月更文挑战第1天】近年来,人工智能得到了迅猛的发展,并在各行各业都得到了广泛应用。尤其是近两年来,AI开发工具逐渐成为开发者们的新宠,其中 GitHub Copilot 更是引发了无限可能性的探索。
637 9
AI 代码工具大揭秘:提高编程效率的必备神器!
|
运维 Cloud Native Devops
云原生技术的创新与挑战
本文将深入探讨云原生技术,分析其创新之处以及面临的主要挑战。我们将从云原生的基本概念入手,逐步解析其核心技术如容器化、微服务架构及DevOps实践,同时结合具体案例,展示这些技术如何在实际应用中发挥作用。最后,文章将讨论云原生技术在未来发展中的潜力和可能遇到的难题,为读者提供一个全面而清晰的理解框架。
|
存储 SQL NoSQL
NoSQL数据库
NoSQL数据库
390 4
一文教会你如何在论文中插入参考文献的角标
这篇文章介绍了在撰写论文时如何添加参考文献编号,并在文中插入这些参考文献的角标,以及如何通过点击文献编号跳转到对应的参考文献列表。
一文教会你如何在论文中插入参考文献的角标
|
安全 关系型数据库 API
Nuxt3 实战 (九):使用 Supabase 实现 Github 认证鉴权
这篇文章介绍了如何在Supabase中使用Github授权登录并实现用户身份验证。文章首先说明了Supabase采用postgresql的Row Level Security(RLS)机制来控制不同用户对数据表访问权限的重要性,然后详细介绍了配置Github OAuth Apps的过程,包括创建新的OAuth应用、填写项目信息、设置回调URL等步骤。接着,文章展示了在Nuxt3中实现登录界面的代码示例,最后总结了通过本教程可以学习到的技能,并预告了下一篇文章将介绍如何在Nuxt3中创建RESTful风格API并结合Supabase数据库完成CURD操作。
316 0
Nuxt3 实战 (九):使用 Supabase 实现 Github 认证鉴权
|
数据采集 小程序 前端开发
IoT小程序在展示中央空调采集数据和实时运行状态上的应用
IoT小程序框架在跨系统平台(AliOS Things、Ubuntu、Linux、MacOS、Window等)方面提供了非常优秀的基础能力,应用的更新升级提供了多种方式,在实际业务开发过程中可以灵活选择。IoT小程序框架通过JSAPI提供了调用系统底层应用的能力,同时提供了自定义JSAPI扩展封装的方法,这样就足够业务开发通过自定义的方式满足特殊的业务需求。 IoT小程序在前端框架能力、应用框架能力、图形框架能力都进行了适配和优化。那么接下来,我们按照其官方步骤搭建开发环境,然后结合中央空调数据采集和状态显示的实际应用场景开发物联网小程序应用。
24224 63
IoT小程序在展示中央空调采集数据和实时运行状态上的应用