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 使用相关推荐

  1. VC6.0 MFC 列表框 列表控件 添加 修改 删除

    VC6.0 MFC 列表框 列表控件 添加 修改 删除 写在前面:列表框是很常用,并且很重要的一个控件,那么接下来,就跟随我的脚步,去探索它的奥秘吧! 一.未卜先知 1.编译运行后,点击"学 ...

  2. 关于怎么获取Repeater控件复选框选中的那一行的数据

    关于怎么获取Repeater控件复选框选中的那一行的数据 1.首先你要有一个repeater控件,并且里面有复选框控件 2.废话不多话,直接上代码 Dim i As Integer'Car是repea ...

  3. 5、Web 窗体的基本控件——复选框控件和复选组控件(CheckBox 和 CheckBoxList)

    5.Web 窗体的基本控件--复选框控件和复选组控件(CheckBox 和 CheckBoxList) 复选框控件和复选组控件(CheckBox 和 CheckBoxList) 前端 <%@ P ...

  4. 基于mschart控件,绘制工控采集类曲线,可对图像进行缩放,拖动滚动条显示放大后的图像

    基于mschart控件,绘制工控采集类曲线,可对图像进行缩放,拖动滚动条显示放大后的图像,并动态显示曲线上的数值点 在工控.采集.测试类项目中经常需要对采集接收回来的数据进行图像.曲线显示,本人在项目 ...

  5. easyui datagrid 控件全选

    easyui datagrid 控件全选 在datagrid控件中全选功能都是easyUI给做好的,只需要将负责全选的复选框设置下面的这个属性为false属性即可全部选中 singleSelect:f ...

  6. GridView控件修改、删除示例(修改含有DropDownList控件)

    GridView控件修改.删除例子,修改时含有DropDownList控件. 示例运行效果图: GridViewUp.aspx文件代码: <%@ Page Language="C#&q ...

  7. 解决 MSChart控件 X轴坐标显示不全的问题

    前一阵子做开发用到微软的MSChart控件,功能虽然强大,但是从来没用过,一直处在摸索之中,一个小问题花了半天时间去研究.终于把X轴坐标显示不全的问题给解决了,当然也在网上找了很多的资料才搞定的,今天 ...

  8. C# mschart 控件的基本使用和图表控件Series的概念

    使用sharpdevelop: 此工具默认没有mschart控件:把如下dll添加到引用: 工具箱里面把控件加出来:sharpdevelop加控件到工具箱见此: https://blog.csdn.n ...

  9. SAP UI5 应用开发教程之六十六 - 基于 OData V4 的 SAP UI5 表格控件如何实现删除功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

最新文章

  1. 基于Springboot实现仿百度网盘开发
  2. React.js再探(四)
  3. PLSQL 使用技巧汇总贴(一个坑)
  4. 如何将excel表格内的数据导入至mysql数据库
  5. centos7.4安装图形界面及报错处理
  6. 201117阶段二SQLite数据库
  7. git clone 分支_Git 小团队的协作 (二)
  8. python读取文件名有中文_[请教]python的中文文件名处理
  9. linux的硬件运行环境,linux下常用的硬件测试软件
  10. YII composer全局安装
  11. 120多套各种类别微信小程序模板源码
  12. Mac安装Mysql,并启动
  13. 如何删除远程桌面计算机ip,远程桌面连接IP地址清除方法
  14. CDN是什么?使用CDN有什么优势?
  15. 最大数[抽象排序之抽象规则]
  16. 阿里读光OCR原理介绍ppt之 crnn ctc + centerloss 提升形近字识别
  17. DCB value for SVN 77 not found on dcb.dat
  18. pc端ui图片尺寸_PC端UI设计尺寸规范?
  19. 生物特征识别数据泄露事件
  20. HTML圣诞树代码(动态效果)

热门文章

  1. 【实习日记】Linux-VM15-Ubuntu18.04 + 运行selenium实现文件下载
  2. 企业管理 史玉柱:公司只有三个人可以谈战略,其他人抓好执行
  3. oracle gc buffur,【性能調優】Oracle AWR報告指標全解析
  4. 关于表情识别-综述 FER --FER2013
  5. p值 统计学意义_统计学意义不重要为什么p值不应过高
  6. java计算上个工作日方法
  7. 计算机打字失灵,电脑键盘在打字的时候出现按键失灵的原因是什么
  8. 惊蛰时节,最好看的微信公众号图文排版,全在这里了
  9. mac开机启动mysql_mac 设置mysql开机自启动
  10. MAC OS无法开机问题解决