C# Chart可拖动选择数据范围(StripLine实现)

经过不懈的努力,和参考各种别人写的资料,终于捣鼓出来初版的  可拖动StripLine来选择范围。

首先画竖线是通过Chart你的StripLine实现:

StripLine sl1 = new StripLine();//新建一个插入线

sl1.BackColor = System.Drawing.Color.Red
sl1.IntervalOffset = 2;//通过IntervalOffset来设置线的位置        
sl1.StripWidth = 1;//设置线的宽度
sl1.Tag = 1;//设置线的标记,用于区分选中的哪个
//sl1.TextAlignment = StringAlignment.Near;
chart1.ChartAreas[0].AxisX.StripLines.Add(sl1);//插入垂直于X轴的StripLine,若垂直于Y轴则用AxisY。

然后就是chart的鼠标事件,我主要用了MouseDown、MouseUp、MouseMove三个事件来实现选中StripLine,拖动以及更新。

下面放一些主要事件代码:

MouseDown事件选中StripLine,其中判定选中的哪一条StripLine是通过Tag来判断的(这个搞了好久···)

private void chart1_MouseDown(object sender, MouseEventArgs e)
        {
          
            if (e.Button == MouseButtons.Right) return;//右键忽略        
            HitTestResult hit = chart1.HitTest(e.X, e.Y);
            if (hit.ChartElementType == ChartElementType.StripLines)
            {
                this.Cursor = Cursors.SizeWE;//鼠标变成左右有箭头的形式
                StripLine sltemp = new StripLine();
                //hit.Object = sltemp;
                sltemp = hit.Object as StripLine;
                //var sltemp = ConvertObject<StripLine>(hit.Object);
                int a = (int)sltemp.Tag; //获得选中的StripLine的Tag
                if (a == 1)
                {
                    striplineselcet = 0;                  
                    this.chart1.MouseMove += new
                    MouseEventHandler(chart1_MouseMove);
                }
                else if (a == 2)
                {
                    striplineselcet = 1;
                    this.chart1.MouseMove += new
                    MouseEventHandler(chart1_MouseMove);
                }
            }           

        }

MouseMove是获得当前鼠标位置对应的横坐标位置:

private void chart1_MouseMove(object sender, MouseEventArgs e)
        {            
            var area = chart1.ChartAreas[0];            
            HitTestResult hit = chart1.HitTest(e.X, e.Y);
            //需先判断鼠标在绘图区,否则PixelPositionToValue会超出范围
            if (hit.ChartElementType == ChartElementType.PlottingArea)
            {
                xv = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);//xv是定义好的全局变量
                var yv = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);                
                richTextBox1.Text = "x = " + xv.ToString("N3") + "\n" + "   y =" +         yv.ToString("N3");
                labelX.Text = "X:" + xv.ToString("N3");
                labelY.Text = "Y:" + yv.ToString("N3");
                
            }            
            labeleX.Text = "e.X:" + e.X.ToString("N3");
            labeleY.Text = "e.Y:" + e.Y.ToString("N3");          
        }

最后就是MouseUp事件,用来将选择的StripLine释放掉,同时更新线的位置:

private void chart1_MouseUp(object sender, MouseEventArgs e)
        {
            if (striplineselcet == 0)
                sl1.IntervalOffset = xv;
            else if (striplineselcet == 1)
                sl2.IntervalOffset = xv;
            //sl1.IntervalOffset = lcl;
            //sl2.IntervalOffset = ucl;
            tBLCL.Text = sl1.IntervalOffset.ToString("N5");
            tBUCL.Text = sl2.IntervalOffset.ToString("N5");
            chart1.Invalidate();
            striplineselcet = 2;
            this.Cursor = Cursors.Default;//鼠标变回默认形态
        }

以上就基本完成了,只是不能实时的更新的拖动中的线。

附上界面图:

以上主要参考如下大神的资源:

https://www.it1352.com/509041.html

https://blog.csdn.net/qq_30725967/article/details/86502990

https://www.cnblogs.com/puffy/p/11440775.html

菜鸟第一次发稿,大家将就看哈~~~

  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值