ZedGraph C# Graph Data Export to CSV Using a Custom Context Menu

In continuation of my earlier post on ZedGraph example which plots a sinosoidal graph, I have extended it further to:

Add a new custom menu item in context menu(which appears on right click on the graph)

Export Graph plot data to CSV (coma separated values) file. Which can be opened by spreadsheets such as Microsoft Excel and Open Office calc.

For the custom context menu, the code has been derived from ZedGraph Wikipage. The following is the code of the Windows Form which has the ZedGraph control.

[sourcecode language='c#']
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ZedGraph;
using System.IO;

namespace ZedGraphTest
{
public partial class Form1 : Form
{
private PointPairList m_pointPairList;
//CSV Writer
private StreamWriter m_CSVWriter;

public Form1()
{
InitializeComponent();
CreateGraph();
SetSize();

//csv
zedGraphControl.ContextMenuBuilder +=
new ZedGraphControl.ContextMenuBuilderEventHandler(MyContextMenuBuilder);
}

private void CreateGraph()
{
GraphPane myPane = zedGraphControl.GraphPane;

// Set the titles and axis labels
myPane.Title.Text = “ZedGraph Test”;
myPane.XAxis.Title.Text = “theta (angle)”;
myPane.YAxis.Title.Text = “Sin (theta)”;

// Make up some data points from the Sine function
m_pointPairList = new PointPairList();
for (double x = 0; x <= 360; x += 10)
{
double y = Math.Sin(x * Math.PI / 180.0);

m_pointPairList.Add(x, y);
}
// Generate a blue curve with Plus symbols,
LineItem _myCurve1 = myPane.AddCurve("Sin (theta)",
m_pointPairList, Color.Blue, SymbolType.Plus);

// Fill the pane background with a color gradient
myPane.Fill = new Fill(Color.White, Color.FromArgb(220, 220, 255), 45F);

//Make the MajorGrids of Axes visible
myPane.XAxis.MajorGrid.IsVisible = true;
myPane.YAxis.MajorGrid.IsVisible = true;

// Calculate the Axis Scale Ranges
zedGraphControl.AxisChange();
}

private void Form1_Resize(object sender, EventArgs e)
{
SetSize();
}

private void SetSize()
{
zedGraphControl.Location = new Point(10, 10);
// Leave a small margin around the outside of the control
zedGraphControl.Size = new Size(this.ClientRectangle.Width - 20,
this.ClientRectangle.Height - 20);
}

private void MyContextMenuBuilder(ZedGraphControl control,
ContextMenuStrip menuStrip, Point mousePt,
ZedGraphControl.ContextMenuObjectState objState)
{
// create a new menu item
ToolStripMenuItem _item = new ToolStripMenuItem();
// This is the user-defined Tag so you can find this menu item later if necessary
_item.Name = "Export Data as CSV";
_item.Tag = "export_data_csv";
// This is the text that will show up in the menu
_item.Text = "Export Data as CSV";
// Add a handler that will respond when that menu item is selected
_item.Click += new System.EventHandler(ShowSaveAsForExportCSV);
// Add the menu item to the menu,as 3rd Item
menuStrip.Items.Insert(2, _item);
}

private void ShowSaveAsForExportCSV(object sender, System.EventArgs e)
{
try
{
//show saveAs CmdDlg
saveFileDialog1.Filter = "CSV files (*.csv)|*.csv";
saveFileDialog1.ShowDialog();
m_CSVWriter = new StreamWriter(saveFileDialog1.FileName);
WriteCSVToStream();
m_CSVWriter.Close();
MessageBox.Show("CSV File Saved", " ZedGraph ", MessageBoxButtons.OK);
}
catch (Exception ex)
{
m_CSVWriter.Close();
MessageBox.Show(ex.ToString());
}
}

private void WriteCSVToStream()
{
//First line is for Headers., X and Y Axis
string _xAxisHeader = CheckCSVString(zedGraphControl.GraphPane.XAxis.Title.Text);
string _yAxisHeader = CheckCSVString(zedGraphControl.GraphPane.YAxis.Title.Text);
m_CSVWriter.Write(_xAxisHeader + "," + _yAxisHeader + "n");

//subsequent lines are having data
for (int i = 0; i < m_pointPairList.Count; i++)
{
m_CSVWriter.Write(m_pointPairList[i].X + "," + m_pointPairList[i].Y + "n");
}
}

private string CheckCSVString(string _string)
{//Check to see if there are any characters that can disturb the CSV delimeters.
string _returnString = _string;
if (_string.IndexOfAny("",x0Ax0D".ToCharArray()) > -1)
{
_returnString = “”" + _string.Replace(“”", “”"”) + “”";
}
return _returnString;
}

}
}

[/sourcecode]

6 thoughts on “ZedGraph C# Graph Data Export to CSV Using a Custom Context Menu

  1. Pingback: Opensource C# Graph Plotting library- ZedGraph v/s NPlot | SmallGuru

  2. Pingback: Zedgraph C# Graph Plot Example Application | SmallGuru

  3. Pingback: ZedGraph C# Graph Data Export to CSV Using a Custom Context MenuTagged Under : tutorials, Visual C#, Visual Studio Posted in Visual C#, tutorials by rajeev

  4. Pingback: Rokudenashi Blues » Blog Archive » JasperReports

  5. Hello Rajeev!

    I wrote in your other post about ZedGraph, however I need some additional data.I have a project with 6 particle counters.Each particle counter has 6 channels being:First is product ID = 01, 02, 03, 04, 05, 06.Second is 2mm.3rd is 7mm.4th is 10mm.The other two are for error messages and will not use in the Graphs.The devices return data automatically from time intervals.It is possible we use ZedGraph and create a dynamic chart, ie in real time?

    Thanks and Regards,
    ocaccy

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>