using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Xml.Serialization;
namespace Devintelligence.Example {
public partial class Form1 : Form
{
#region Fields
public SerializableDictionary<string, int> data = new SerializableDictionary<string, int>();
private Font systemFont;
private XmlSerializer serializer = new XmlSerializer(typeof(SerializableDictionary<string, int>));
#endregion
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
if (File.Exists(FilePath))
{
// load from file & desirialize
using (FileStream filestream = File.OpenRead(FilePath))
{
data = serializer.Deserialize(filestream) as SerializableDictionary<string, int>;
}
}
((ISupportInitialize)dataGridView1).BeginInit();
dataGridView1.VirtualMode = true;
dataGridView1.CellValueNeeded += new DataGridViewCellValueEventHandler(dataGridView1_CellValueNeeded);
dataGridView1.CellValuePushed += new DataGridViewCellValueEventHandler(dataGridView1_CellValuePushed);
// create columns
for (int i = 0; i < 100 ; i++)
{
string name = string.Format("{0}", i);
dataGridView1.Columns.Add(name, name);
}
dataGridView1.RowCount = 100000;
systemFont = new Font(dataGridView1.Font,FontStyle.Bold);
((ISupportInitialize)dataGridView1).EndInit();
}
/// <summary>
/// Calculates the unique hash key based on row and column indexes.
/// </summary>
/// <param name="rowIndex">Index of the row.</param>
/// <param name="columnIndex">Index of the column.</param>
/// <returns></returns>
private static string CalculateKey(int rowIndex, int columnIndex)
{
return string.Format("{0}_{1}", rowIndex, columnIndex);
}
/// <summary>
/// Handles the CellValuePushed event of the dataGridView1 control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="T:System.Windows.Forms.DataGridViewCellValueEventArgs"/>
/// instance containing the event data.</param>
void dataGridView1_CellValuePushed(object sender, DataGridViewCellValueEventArgs e)
{
data[CalculateKey(e.RowIndex, e.ColumnIndex)] = Convert.ToInt32(e.Value);
// mark changed cells
dataGridView1[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.LightPink;
dataGridView1[e.ColumnIndex, e.RowIndex].Style.Font = systemFont;
}
/// <summary>
/// Handles the CellValueNeeded event of the dataGridView1 control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="T:System.Windows.Forms.DataGridViewCellValueEventArgs"/>
/// instance containing the event data.</param>
void dataGridView1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
int value;
if (data.TryGetValue(CalculateKey(e.RowIndex, e.ColumnIndex), out value))
{
e.Value = value;
// mark changed cells
dataGridView1[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.LightPink;
dataGridView1[e.ColumnIndex, e.RowIndex].Style.Font = systemFont;
}
else
{
e.Value = e.ColumnIndex*e.RowIndex;
}
}
private static string FilePath
{
get
{
// the data file will be saved in file named data.xml
return Path.Combine(Application.StartupPath, "data.xml");
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// serialize & save entered data
using (FileStream filestream = File.Open(FilePath, FileMode.Create))
{
serializer.Serialize(filestream, data);
}
}
}
}