ChartClickEvents 获取Chart上的数据

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;


namespace SaveChartDataDemo
{
    public partial class FrmChart : Form
    {
        int Id = 0;//鼠标获取元素Id
        int endId = 0;//表尾元素Id
        public DataTable dtDataInit = null;//初始数据
        public DataTable dtDataTmp = new DataTable();//临时数据
        public DataTable dtDataShow = new DataTable();
        DataPoint selected;


        public FrmChart()
        {
            InitializeComponent();
            PaintChart();
        }


        #region PaintChart()
        void PaintChart()
        {
            if (dtDataInit == null)
            {
                dtDataInit = new DataTable();
                dtDataInit.Columns.Add("Id", typeof(string));
                dtDataInit.Columns.Add("Value", typeof(double));
                dtDataInit.Columns[0].Caption = "System.String";
                dtDataInit.Columns[0].DataType = typeof(string);
                dtDataInit.Columns[1].Caption = "System.Double";
                dtDataInit.Columns[1].DataType = typeof(double);


                FileRead("test.txt");
                PaintChart(dtDataShow);
            }
        }
        void PaintChart(DataTable dt)
        {
            this.chart1.Series[0].Points.Clear();
            this.chart1.Series[0].Color = Color.FromArgb(200, 65, 140, 240);
            this.chart1.ChartAreas[0].BackColor = Color.FromArgb(220, 220, 220);
            this.chart1.Series[0].Font = new Font("Trebuchet MS", 10F, FontStyle.Bold);
            string []XValue=new string[dt.Rows.Count];
            Double []YValue=new double [dt.Rows.Count];
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                XValue[i] = dt.Rows[i][0].ToString();
                YValue[i] = Convert.ToDouble(dt.Rows[i][1]);
            }
            this.chart1.Series[0].Points.DataBindXY(XValue, YValue); 
        }
        #endregion


        public void FileRead(string path)
        {
            DataRow dr = null;


            FileStream fs = File.OpenRead(path);
            StreamReader reader = new StreamReader(fs, Encoding.Default);
            int endIdTmp = 0;
            string line = "";
            char[] splitchar = { ' ', '\t', ',' };//不需要保留的元素
            while ((line = reader.ReadLine()) != null)
            {
                string[] value = line.Split(splitchar, StringSplitOptions.RemoveEmptyEntries);
                if (dr==null)
                {
                    dr = dtDataInit.NewRow();
                }
                for (int i = 0; i < dtDataInit.Columns.Count;i++ )
                {
                    dr[i] = value[i];
                }
                endIdTmp = Convert.ToInt32(dr[0]);
                dtDataInit.Rows.Add(dr);
                dr = null;
            }
            dtDataTmp = dtDataInit.Copy();
            dtDataShow = dtDataInit.Copy();
            endId = endIdTmp;
            reader.Close();
            fs.Close();
        }

       //双击Chart上的节点,保存其两端各n个数据
        public void SaveDataInRange()
        {
            if (dtDataTmp.Rows.Count>0)
            {
                int endIdTmp = 0;
                DataRow dr = null;
                int valueRange = Convert.ToInt32(txb_Range.Text);
                int headId = Convert.ToInt32(dtDataTmp.Rows[0][0]);


                DataTable dt = new DataTable();
                if (dt.Columns.Count == 0)
                {
                    dt.Columns.Add("Id", typeof(string));
                    dt.Columns.Add("Value", typeof(double));
                    dt.Columns[0].Caption = "System.String";
                    dt.Columns[0].DataType = typeof(string);
                    dt.Columns[1].Caption = "System.Double";
                    dt.Columns[1].DataType = typeof(double);
                }
                if (dt.Rows.Count>0)
                {
                    dt.Clear();
                }
                if (Id - headId < valueRange && endId <= (valueRange + Id))
                {
                    for (int i = 0; i < dtDataTmp.Rows.Count; i++)
                    {
                        if (dr == null)
                        {
                            dr = dt.NewRow();
                        }
                        for (int j = 0; j < dtDataTmp.Columns.Count; j++)
                        {
                            dr[j] = dtDataTmp.Rows[i][j];
                        }
                        endIdTmp = Convert.ToInt32(dr[0]);
                        dt.Rows.Add(dr);
                        dr = null;
                    }
                }


                if (Id - headId >= valueRange && endId <= (valueRange + Id))
                {
                    for (int i = (Id - headId - valueRange); i < dtDataTmp.Rows.Count; i++)
                    {
                        if (dr == null)
                        {
                            dr = dt.NewRow();
                        }
                        for (int j = 0; j < dtDataTmp.Columns.Count; j++)
                        {
                            dr[j] = dtDataTmp.Rows[i][j];
                        }
                        endIdTmp = Convert.ToInt32(dr[0]);
                        dt.Rows.Add(dr);
                        dr = null;
                    }
                }


                if (Id - headId < valueRange && endId > (valueRange + Id))
                {
                    for (int i = 0; i < (dtDataTmp.Rows.Count - (endId - Id - valueRange)); i++)
                    {
                        if (dr == null)
                        {
                            dr = dt.NewRow();
                        }
                        for (int j = 0; j < dtDataTmp.Columns.Count; j++)
                        {
                            dr[j] = dtDataTmp.Rows[i][j];
                        }
                        endIdTmp = Convert.ToInt32(dr[0]);
                        dt.Rows.Add(dr);
                        dr = null;
                    }
                }


                if (Id - headId >= valueRange && endId > (valueRange + Id))
                {
                    for (int i = (Id - headId - valueRange); i < (dtDataTmp.Rows.Count - (endId - Id - valueRange)); i++)
                    {
                        if (dr == null)
                        {
                            dr = dt.NewRow();
                        }
                        for (int j = 0; j < dtDataTmp.Columns.Count; j++)
                        {
                            dr[j] = dtDataTmp.Rows[i][j];
                        }
                        endIdTmp = Convert.ToInt32(dr[0]);
                        dt.Rows.Add(dr);
                        dr = null;
                    }
                }
                endId = endIdTmp;
                dtDataTmp.Clear();
                dtDataTmp = dt.Copy();
                dtDataShow = dtDataTmp.Copy();


                string path = "Savetest.txt";
                if (File.Exists(path))
                {
                    File.Delete(path);
                }
                FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs);


                for (int i = 0; i < dtDataTmp.Rows.Count; i++)
                {
                    sw.WriteLine(dtDataTmp.Rows[i][0]+" "+dtDataTmp.Rows[i][1]);
                }
                sw.Close();
                fs.Close();
            }
            return;
        }

        //Chart图像类型改变事件
        # region TypeChang(object sender, EventArgs e)
        private void TypeChanged(object sender, EventArgs e)
        {
            
            if (this.rdb_BrokenLine.Checked)
            {
                this.chart1.Series[0].ChartType = SeriesChartType.Line;
                this.chart1.Series[0].BorderWidth = 4;
            }
            if (this.rdb_Scattergram.Checked)
            {
                this.chart1.Series[0].ChartType = SeriesChartType.Point;
                this.chart1.Series[0].MarkerSize = 4;
            }
            if (this.rdb_Histogram.Checked)
            {
                this.chart1.Series[0].ChartType = SeriesChartType.Column;
                this.chart1.Series[0]["DrawingStyle"] = "Cylinder";
            }
        }
        #endregion
        /// <summary>
        /// 数据恢复
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDataReduction_Click(object sender, EventArgs e)
        {
            if (dtDataTmp != null)
            {
                dtDataTmp.Clear();
            }
            dtDataTmp = dtDataInit.Copy();


            if (dtDataShow != null)
            {
                dtDataShow.Clear();
            }
            dtDataShow = dtDataInit.Copy();
            PaintChart(dtDataShow);
        }
        /// <summary>
        /// 存储某一范围内的数据个数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ChartMouseDoubleClick(object sender, MouseEventArgs e)
        {
            HitTestResult result = this.chart1.HitTest(e.X, e.Y);
            if (result.ChartElementType == ChartElementType.DataPoint)
            {
                this.selected = result.Object as DataPoint;
                this.txb_X.Text = selected.AxisLabel;
                this.txb_Y.Text = selected.YValues[0].ToString();
                Id = Convert.ToInt32(selected.AxisLabel);
                SaveDataInRange();
                if (dtDataShow != null)
                {
                    dtDataShow.Clear();
                }
                dtDataShow = dtDataTmp.Copy();
                PaintChart(dtDataShow);
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值