热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#实现chart控件图表的漫游

C#中的chart控件是非常强大的,可以轻松实现数据的可视化,用


C#中的chart控件是非常强大的,可以轻松实现数据的可视化,用于自己的数据处理是非常方便的。

在我之前的一篇文章中,我讲了如何对chart中的数据进行框选、删除、平移等功能(详细见C#实现chart控件数据点的框选、删除、平移),这次我又新添加了一个功能,chart的漫游。我就是在自己处理数据过程中慢慢摸索,慢慢增加我的程序的功能,下面就来看看如何实现chart图表的漫游。

在chart中,有时需要放大查看数据,但是很容易出现下面的情况,数据超出显示范围了。

C#实现chart控件图表的漫游 - 文章图片

虽然有滚动条按钮,但每次都要点滚动条,感觉也挺累的,而且不是很好控制滚动大小,所以我想到了要实现一个chart图表的漫游功能。

要实现漫游功能,需要了解chart坐标轴的一个属性,它就是数据视图位置属性。

C#实现chart控件图表的漫游 - 文章图片

这个Position表示的是滚动条左端当前的视图位置,那么就容易想到,漫游功能的实现其实就是设置这个Position的值。根据我们的习惯,以X轴方向为例,当按住鼠标从右往左拖动时,chart的视图应该是从左向右移动,也就是往X轴变大的方向显示数据。那么我们只要记住按下鼠标时刻的坐标start.X和松开鼠标时刻的坐标end.X,两者做差,再加上当前的Position,就是漫游后新的Position的位置。代码表示就是

chart1.ChartAreas[0].AxisX.ScaleView.Position += start.X - end.X;

这里要注意,虽然根据实现方法是这样列出式子,但是等式两边的坐标系不同,左边的Position的坐标系是chart数据坐标系,而右边是chart控件坐标系,关于这两个坐标系的转换,可以通过上面的链接去看我上一篇文章的介绍,这里不再赘述。所以这里我们需要把chart控件坐标系转换到chart数据坐标系。根据反算公式,可以知道

chart1.Series[0].Point.XValue = chart1.ChartAreas[0].AxisX.ScaleView.ViewMinimum + (x * 100.0 / (double)chart1.Width - (double)chart1.ChartAreas[0].InnerPlotPosition.X) / xpercent;

那么只要把XValue替换成Position,x替换成start.X-end.X,就是我们要求的新的Position,代码表示就是

chart1.ChartAreas[0].AxisX.ScaleView.Position = chart1.ChartAreas[0].AxisX.ScaleView.ViewMinimum + ((double)(start.X - end.X) * 100.0 / (double)chart1.Width - (double)chart1.ChartAreas[0].InnerPlotPosition.X) / xpercent;

这就是X轴方向的漫游公式。

Y轴方向的漫游,类似X轴,但是很重要一点要注意,chart控件坐标系的Y轴和chart数据点坐标系的Y轴方向是相反的,前者向下为正,后者向上为正,所以在转换前,还需要把向下的坐标系转换到向上的方向上来,这个转换很简单,设同一个点,在chart控件坐标系中Y坐标是y2,在chart数据点坐标系中Y坐标是y1,那么就有

y1 = chart1.Height - y2

而且还有一点需要注意,鼠标从上往下拖动时,Y值其实是增大的,那么这里就和X轴相反了,是

chart1.ChartAreas[0].AxisY.ScaleView.Position += chart1.Height - (end.Y - start.Y);

再考虑坐标转换,完整的代码就是

chart1.ChartAreas[0].AxisY.ScaleView.Position = chart1.ChartAreas[0].AxisY.ScaleView.ViewMaximum - ((double)(chart1.Height - end.Y + start.Y) * 100.0 / (double)chart1.Height - (double)chart1.ChartAreas[0].InnerPlotPosition.Y) / ypercent;

这样我们就可以实现chart图表的漫游功能啦。

下面给出漫游功能核心代码

Point start = new Point();
Point end = new Point();
private void chart1_MouseDown(object sender, MouseEventArgs e)
{
start.X = e.X;
start.Y = e.Y;
}

private void chart1_MouseUp(object sender, MouseEventArgs e)
{double x_min = chart1.ChartAreas[0].AxisX.Minimum;double y_min = chart1.ChartAreas[0].AxisY.Minimum;double xpercent = (double)chart1.ChartAreas[0].InnerPlotPosition.Width / (chart1.ChartAreas[0].AxisX.ScaleView.ViewMaximum - chart1.ChartAreas[0].AxisX.ScaleView.ViewMinimum);double ypercent = (double)chart1.ChartAreas[0].InnerPlotPosition.Height / (chart1.ChartAreas[0].AxisY.ScaleView.ViewMaximum - chart1.ChartAreas[0].AxisY.ScaleView.ViewMinimum);//////计算Position的位置chart1.ChartAreas[0].AxisX.ScaleView.Position = chart1.ChartAreas[0].AxisX.ScaleView.ViewMinimum + ((double)(start.X - end.X) * 100.0 / (double)chart1.Width - (double)chart1.ChartAreas[0].InnerPlotPosition.X) / xpercent;if (chart1.ChartAreas[0].AxisX.ScaleView.Position }

这里我定义了两个参数,x_min和y_min,是当数据视图拖动到数据最左边甚至超过最左边的数据时,控制视图在最小值处,防止出现如下情况。

C#实现chart控件图表的漫游 - 文章图片

但是视图最大值处还不知道如何设置该参数,想用Position+ScrollBar的长度来表示,但是发现并没有参数能表示ScrollBar的长度,因此最右边我也就没有设置了,等以后想到了怎么解决再更新上来。或者有知道的小伙伴给我留言噢,谢谢。



  • 点赞

  • 收藏

  • 分享



    • 文章举报




海的-心
发布了4 篇原创文章 · 获赞 0 · 访问量 248
私信
关注

推荐阅读
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
author-avatar
乐在hhh其中
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有