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);
}
}
}
}
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);
}
}
}
}