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

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

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

1、MSChart基本概况介绍。

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

  一、MSChart基本概况介绍

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

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

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

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

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

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

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

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

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

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

  可以看到,我通过点击【江苏省】,将这块区域突出显示了,这个功能虽然不起眼,但是在实际公司的使用过程中,比如开会的时候有针对性的介绍某块内容的时候就会使用到,而如果在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";

  具体的效果如下:

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

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


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、遍历所有具体的点及图例为其增加一个背景样式,及鼠标手势。

时间: 2024-09-28 22:58:10

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

艾伟也谈项目管理,软件研发中的冲突及解决之道

深圳易方数码科技新技术研究主管,微软MVP时永安认为: 软件项目在研发过程中牵涉到很多利益相关方,这些相关方因为关注角度的不同,会产生很多矛盾冲突.这些冲突,轻则打击士气,拖延项目的进度,重则使项目无法正常进行.在我这些年的软件项目管理工作中,遇到过各种各样的冲突,其中最常见的有:项目开发周期的冲突和团队内部人际关系的冲突. 软件项目的研发周期,本来是应该根据项目工作量和开发人员情况来估算的.但现实中,往往会受到市场部门以及公司高层的干涉.他们从产品销售的角度考虑,希望软件产品越早发布越好,在他

艾伟也谈项目管理,五大绝招 消除项目小组与用户的矛盾

BI项目实施过程中,会导致用户现有工作量的增加,会对用户现有工作进行重新分配,总之会影响用户的即得利益.在这种情况下,项目小组与用户之间矛盾的增加.虽然说BI系统主要是企业管理者在使用但是这个系统的基石基础数据,则是一线用户所提供的. 为此在BI项目过程中,如果项目小组与用户的矛盾比较多,必然会影响到BI系统的实施,因此,BI项目推进中很重要的一项工作,就是如何消除项目小组与用户的矛盾.笔者根据自己的经验,总结出来一下五个绝招.希望对大家有所帮助. 一.合理安排时间尽量减少对用户现有工作的影响

艾伟也谈项目管理,项目经理成长日记(6)——对不上的帐

    中午吃过了午饭,端着杯茶做在休息室里正稍稍休憩.公司内部特别开辟出一个空间,并装修成吧台,高脚转椅,微高的台面和酒吧里面的样子多少有点类似.不少人见过微软.google的office的专修格调,让多少人羡慕而又渴望.其实程序员作为脑力劳动的工作者,有时候我们太需要像作家那样的灵感源泉,所以office的风格或多或少应该尽量给人营造一种比较轻松的环境,这样在轻松的环境中进行高强度的脑力将会尽可能让二者得到一种缓和,从而使质量和效率更为高效. "吃过了?小余."标准的中国人问候的方

艾伟也谈项目管理,对项目管理的几点认识

自2007年参加工作以来,参与的项目也有好几个了,但都是以项目成员的角色参与,从来没有以项目经理的角色参与项目.中国有句古话叫"旁观者清",同一个问题站的角度不同,可能会形成不同的结论.下面我就以一个普通项目成员的角度谈一下对项目管理的几个看法,希望大家给予指正. 1. 团队成员选择 人员选择要谨慎,要尽量选择合适的人员,在选择团队成员时要重点考虑其团队合作能力.编码可读性.能力和项目的匹配度等因素. 2. 项目远景的确定 项目初期项目经理需要和高层以及客户协商,定下项目的远景目标(即

艾伟也谈项目管理,我的项目管理观点

    公司要我给项目经理做一个培训,关于项目经理的做事情的方法和观点方面.我就采用了Workshop的方式,Workshop不是会议模式,而是侧重于交流会谈的一种模式,毕竟大家都是项目经理,并非说我的做法就是对的,所有的一切都是自己的经验之谈,所以我只是说大家彼此分享经验,交流心得.我把我所要分析的内容大概做了一个讲义,也希望更多人能够参与到这个Workshop中.项目经理好做吗?      项目经理好做吗?好做!项目经理好做吗?不好做.不同的人.不同的态度.不同的方法,其结果也就存在有极大的

艾伟也谈项目管理,关于项目管理的一点体会

这段时间,一直在负责一个项目的管理与开发.在时间短.任务紧,而团队人员又大部分是没有经验的菜鸟的恶劣情况下,我带领接近40人的团队,终于在客户规定的时间范围内如期交付产品.这其中,经历了需求变更.人员变动(因为其它任务,先后有近10人离开团队)等诸多问题,项目仍然取得成功了,不能不说有几分侥幸,但此外也有一些经验与教训可以与大家分享. 一.项目开发方面 需求 项目应以需求为核心.一个项目是否能够成功,对需求的准确把握在成功因素中要占上60%的比例.不管系统的架构设计.团队管理有多么的成功,如果需

开发项目过程中辅助方法好处多多

在开发项目过程中,总是会出现大量的辅助方法,例如字符串处理,代码检 验,格式输出等等.如果您发现自己在多次编写类似的代码,可能就要想着如何 把这些代码进行提取,变成辅助方法(亦或是类库甚至框架,关于这方面粒度问 题在此不作讨论).辅助方法的作用除了遵循DRY原则之外,也能让代码更容易 编写,更为清晰,可读性也能更好--而且只要您"去做",就会发现要得到这 些好处并不困难. 在这里举一个最简单的例子,对Index方法的单元测试: [TestMethod] public void Inde

软件-菜鸟求帮助:用myecplise写项目过程中鼠标无意中把一个包移动到了其他包下,我怎么再移回来啊

问题描述 菜鸟求帮助:用myecplise写项目过程中鼠标无意中把一个包移动到了其他包下,我怎么再移回来啊 我用的是myecplise编写的web项目,在编写中查看项目的时候,鼠标无意中把一个放jar包的libs包 移动到了webroot下,我再撤销也回不来,直接拖拽也无法复位,由于是刚接触Java软件行业不久,对 对这些个错误都比较无奈,往往遇到这个情况我都是把项目删除,然后再拿之前的项目写,但是这样 犯错但是不知道好的解决办法,真的是一件很痛苦的事,所以真心求助各位大侠,把你们的经验传授我点

谈谈在项目过程中的发生争论与争吵

    有一句古话说的好,"有人的地方就有江湖".     与瀑布模式相比,敏捷开发 更注重人与人的交流.所以在开发过程中更有可能会发生各种争论.争吵.     首先说为什么会吵起来?个人原因咱就不说了,只说说项目过程中时引起的争论甚至是争吵吧.     1. 对于同一个问题,2个人有不同的观点,谁也说服不了谁     2. 自己的想法或设计被多次否定,自己说不出来哪好,对方说不出来哪差     3. 双方理解不一致,导致结果偏离太大     以上三条是我认为在项目开发过程中经常遇到的