C# mschart 控件 框选 删除部分数据 及游标CursorX CursorY 使用
C# mschart 控件 框选 删除部分数据
实现功能 :
1、鼠标框选,选中chart控件中部分数据;
2、将选中的数据标红显示;
3、删除选中的红色数据;
demo源码下载:https://github.com/DamonDBT/CsharpDemo5
核心代码说明:
1、对画图区域的设置,首先说明chart控件的面积问题。对于下图中的一个chart,有2个Position控制面积大小,
//写在窗体的load内://设置范围区域,很重要!ChartArea ca = this.chart1.ChartAreas[0];//设置画图的大小,这个是带有X Y 轴 的面积ca.Position.Auto = false;ca.Position.Height = 100F;//为了方便,设置100%ca.Position.Width = 100F;//设置内部不包含X Y 轴的比例,ca.InnerPlotPosition.Auto = false;ca.InnerPlotPosition.Height = 90F;ca.InnerPlotPosition.Width = 97F;ca.InnerPlotPosition.X = 3F;//给左侧Y轴留下空间ca.InnerPlotPosition.Y = 3F;//给上面顶部留点空间,
根据上面的说明,按照代码中的设置,每个点的位置,只要根据chart控件的大小,和innerplotposition的比例,可以计算每个点的实际坐标,和鼠标的框选区域坐标进行对比,确定选中的点。
2、坐标换算
//把数据值换算到坐标中,要特别注意。ChartArea ca = this.chart1.ChartAreas[0];double xpercent = ca.InnerPlotPosition.Width / (ca.AxisX.Maximum - ca.AxisX.Minimum);double ypercent = ca.InnerPlotPosition.Height / (ca.AxisY.Maximum - ca.AxisY.Minimum);double x = this.chart1.Width * (ca.InnerPlotPosition.X + (item.Key - ca.AxisX.Minimum) * (xpercent)) / 100;double y = this.chart1.Height * (ca.InnerPlotPosition.Y + (ca.AxisY.Maximum - item.Value) * (ypercent)) / 100;
3、游标使用,CursorX CursorY ,可以实现对选中区域的最大化放大,
chartArea1.CursorX.IsUserEnabled = true;chartArea1.CursorX.IsUserSelectionEnabled = true;chartArea1.CursorX.SelectionColor = System.Drawing.Color.Red;chartArea1.CursorY.IsUserEnabled = true;chartArea1.CursorY.IsUserSelectionEnabled = true;
4、源码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;namespace ChartSelectPoint
{public partial class Form1 : Form{public Form1(){InitializeComponent();}Dictionary<int, double> dicData = new Dictionary<int, double>();private void timer1_Tick(object sender, EventArgs e){if (this.chart1.Series[0].Points.Count < 20){this.chart1.Series[0].Points.AddXY(count, ra.Next(0, 50));this.chart1.ChartAreas[0].AxisX.Minimum = 0;this.chart1.ChartAreas[0].AxisX.Maximum = 19;}else{this.chart1.Series[0].Points.RemoveAt(0);this.chart1.Series[0].Points.AddXY(count, ra.Next(0, 50));this.chart1.ChartAreas[0].AxisX.Minimum = this.chart1.Series[0].Points[0].XValue;this.chart1.ChartAreas[0].AxisX.Maximum = this.chart1.Series[0].Points[19].XValue;}count++;}int count = 0;Random ra = new Random();private int maxCount = 60;private void Form1_Load(object sender, EventArgs e){//1 数据滚动显示//timer1.Interval = 100;//timer1.Enabled = true;//设置范围区域,很重要!ChartArea ca = this.chart1.ChartAreas[0];//设置画图的大小,这个是带有X Y 轴 的面积ca.Position.Auto = false;ca.Position.Height = 100F;//为了方便,设置100%ca.Position.Width = 100F;//设置内部不包含X Y 轴的比例,ca.InnerPlotPosition.Auto = false;ca.InnerPlotPosition.Height = 90F;ca.InnerPlotPosition.Width = 97F;ca.InnerPlotPosition.X = 3F;//给左侧Y轴留下空间ca.InnerPlotPosition.Y = 3F;//给上面顶部留点空间,//数据初始化for (int i = 0; i < this.maxCount; i++){var v = ra.Next(0, 50);dicData.Add(i, v);this.chart1.Series[0].Points.AddXY(i, v);}}private void chart1_SelectionRangeChanged(object sender, CursorEventArgs e){//获得区域的点MessageBox.Show("游标" + e.NewSelectionStart + " " + e.NewSelectionEnd);}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){//return;end.X = e.X;end.Y = e.Y;//TODO 1、坐标计算!!!! 是重点 ,开始,停止的 X Y ,各个点的X YDictionary<int, double> dicDataSave = new Dictionary<int, double>();Dictionary<int, double> dicDataDel = new Dictionary<int, double>();//double minValue = (from d in dicData.Values select d).ToList().Min();//double maxValue = (from d in dicData.Values select d).ToList().Max();ChartArea ca = this.chart1.ChartAreas[0];double xpercent = ca.InnerPlotPosition.Width / (ca.AxisX.Maximum - ca.AxisX.Minimum);double ypercent = ca.InnerPlotPosition.Height / (ca.AxisY.Maximum - ca.AxisY.Minimum);int dicCount = 0;foreach (KeyValuePair<int, double> item in dicData){//把数据值换算到坐标中,要特别注意。double x = this.chart1.Width * (ca.InnerPlotPosition.X + (item.Key - ca.AxisX.Minimum) * (xpercent)) / 100;double y = this.chart1.Height * (ca.InnerPlotPosition.Y + (ca.AxisY.Maximum - item.Value) * (ypercent)) / 100;float minx = start.X < end.X ? start.X : end.X;float maxx = start.X < end.X ? end.X : start.X;float miny = start.Y < end.Y ? start.Y : end.Y;float maxy = start.Y < end.Y ? end.Y : start.Y;bool isSave = true;if (x > minx && x < maxx){if (y > miny && y < maxy){isSave = false;dicDataDel.Add(item.Key, item.Value);this.chart1.Series[0].Points[dicCount].Color = Color.Red;}}if (isSave){dicDataSave.Add(item.Key, item.Value);}dicCount++;}if (MessageBox.Show("确定删除红色的点 ?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning)== DialogResult.OK){dicData = dicDataSave;//确定删除,才替换数据this.chart1.Series[0].Points.Clear();foreach (KeyValuePair<int, double> item in dicData){this.chart1.Series[0].Points.AddXY(item.Key, item.Value);}}else{ foreach (var item in this.chart1.Series[0].Points){if (item.Color == Color.Red){item.Color = Color.Black;}}}}private void chart1_MouseMove(object sender, MouseEventArgs e){//TODO 在拉动的过程中,增加方框虚线//鼠标移动到值上,显示数值//HitTestResult myTestResult = chart1.HitTest(e.X, e.Y);//if (myTestResult.ChartElementType == ChartElementType.DataPoint)//{// this.Cursor = Cursors.Cross;// int i = myTestResult.PointIndex;// DataPoint dp = myTestResult.Series.Points[i];// double doubleXValue = (dp.XValue);// double doubleYValue = dp.YValues[0];// //自我实现值的显示// this.textBox1.Text = doubleXValue.ToString(); //}//else//{// this.Cursor = Cursors.Default;//}}private void DrawLine(){}private void chart1_GetToolTipText(object sender, System.Windows.Forms.DataVisualization.Charting.ToolTipEventArgs e){//鼠标移动到值上,显示数值if (e.HitTestResult.ChartElementType == ChartElementType.DataPoint){this.Cursor = Cursors.Cross;int i = e.HitTestResult.PointIndex;DataPoint dp = e.HitTestResult.Series.Points[i];e.Text = string.Format("数值:{1:F3}" + e.HitTestResult.Series.ChartArea + " \n日期:{0}", DateTime.FromOADate(dp.XValue), dp.YValues[0]);}else{this.Cursor = Cursors.Default;}}}}
C# mschart 控件 框选 删除部分数据 及游标CursorX CursorY 使用相关推荐
- VC6.0 MFC 列表框 列表控件 添加 修改 删除
VC6.0 MFC 列表框 列表控件 添加 修改 删除 写在前面:列表框是很常用,并且很重要的一个控件,那么接下来,就跟随我的脚步,去探索它的奥秘吧! 一.未卜先知 1.编译运行后,点击"学 ...
- 关于怎么获取Repeater控件复选框选中的那一行的数据
关于怎么获取Repeater控件复选框选中的那一行的数据 1.首先你要有一个repeater控件,并且里面有复选框控件 2.废话不多话,直接上代码 Dim i As Integer'Car是repea ...
- 5、Web 窗体的基本控件——复选框控件和复选组控件(CheckBox 和 CheckBoxList)
5.Web 窗体的基本控件--复选框控件和复选组控件(CheckBox 和 CheckBoxList) 复选框控件和复选组控件(CheckBox 和 CheckBoxList) 前端 <%@ P ...
- 基于mschart控件,绘制工控采集类曲线,可对图像进行缩放,拖动滚动条显示放大后的图像
基于mschart控件,绘制工控采集类曲线,可对图像进行缩放,拖动滚动条显示放大后的图像,并动态显示曲线上的数值点 在工控.采集.测试类项目中经常需要对采集接收回来的数据进行图像.曲线显示,本人在项目 ...
- easyui datagrid 控件全选
easyui datagrid 控件全选 在datagrid控件中全选功能都是easyUI给做好的,只需要将负责全选的复选框设置下面的这个属性为false属性即可全部选中 singleSelect:f ...
- GridView控件修改、删除示例(修改含有DropDownList控件)
GridView控件修改.删除例子,修改时含有DropDownList控件. 示例运行效果图: GridViewUp.aspx文件代码: <%@ Page Language="C#&q ...
- 解决 MSChart控件 X轴坐标显示不全的问题
前一阵子做开发用到微软的MSChart控件,功能虽然强大,但是从来没用过,一直处在摸索之中,一个小问题花了半天时间去研究.终于把X轴坐标显示不全的问题给解决了,当然也在网上找了很多的资料才搞定的,今天 ...
- C# mschart 控件的基本使用和图表控件Series的概念
使用sharpdevelop: 此工具默认没有mschart控件:把如下dll添加到引用: 工具箱里面把控件加出来:sharpdevelop加控件到工具箱见此: https://blog.csdn.n ...
- SAP UI5 应用开发教程之六十六 - 基于 OData V4 的 SAP UI5 表格控件如何实现删除功能试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
最新文章
- 基于Springboot实现仿百度网盘开发
- React.js再探(四)
- PLSQL 使用技巧汇总贴(一个坑)
- 如何将excel表格内的数据导入至mysql数据库
- centos7.4安装图形界面及报错处理
- 201117阶段二SQLite数据库
- git clone 分支_Git 小团队的协作 (二)
- python读取文件名有中文_[请教]python的中文文件名处理
- linux的硬件运行环境,linux下常用的硬件测试软件
- YII composer全局安装
- 120多套各种类别微信小程序模板源码
- Mac安装Mysql,并启动
- 如何删除远程桌面计算机ip,远程桌面连接IP地址清除方法
- CDN是什么?使用CDN有什么优势?
- 最大数[抽象排序之抽象规则]
- 阿里读光OCR原理介绍ppt之 crnn ctc + centerloss 提升形近字识别
- DCB value for SVN 77 not found on dcb.dat
- pc端ui图片尺寸_PC端UI设计尺寸规范?
- 生物特征识别数据泄露事件
- HTML圣诞树代码(动态效果)
热门文章
- 【实习日记】Linux-VM15-Ubuntu18.04 + 运行selenium实现文件下载
- 企业管理 史玉柱:公司只有三个人可以谈战略,其他人抓好执行
- oracle gc buffur,【性能調優】Oracle AWR報告指標全解析
- 关于表情识别-综述 FER --FER2013
- p值 统计学意义_统计学意义不重要为什么p值不应过高
- java计算上个工作日方法
- 计算机打字失灵,电脑键盘在打字的时候出现按键失灵的原因是什么
- 惊蛰时节,最好看的微信公众号图文排版,全在这里了
- mac开机启动mysql_mac 设置mysql开机自启动
- MAC OS无法开机问题解决