Displaying large amount of data in DataGridView

DataGridView supports the special mode (Virtual Mode). The basic idea is that inside the control not stored any data.
In given below example of the primitive electronic table, the data stored in the hashtable.The electronic table has a large amount of cells. In this example the number of cells equals to 100000 lines * 100 columns = 10000000. Also the programm save and loads changed cells on the disk

Note: The SerializableDictionary can be found here

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

Interesting blog posts (February 11)

Ohad’s Weblog IE7Pro – a must have add-in if you use IE7 !

Simple Living Simple Thinking Zip and Unzip files programmatically

Bill’s House O Insomnia AcceptChanges and Updates once more

Certifications and Software Development More C# 3.0 ? Extension Methods

Thom Robbins .NET Weblog Introduction to Building XML Web Services with ASMX

Validating properties in a PropertyGrid control

The easiest way to validate a certain property is using the PropertyValueChanged event.The code bellow shows how to limit the valid range of Age property to be 1-150

using System.Windows.Forms; 
namespace WindowsApplication1 
{ 
    public partial class Form1 : Form 
    { 
        public Form1() 
        { 
            InitializeComponent(); 
            //init person object  
            Person person = new Person(); 
            person.FirstName = "George"; 
            person.Age = 33; 
            propertyGrid.SelectedObject = person; 
            propertyGrid.PropertyValueChanged+=  new PropertyValueChangedEventHandler( propertyGrid_PropertyValueChanged ); 
        } 
 
        private void propertyGrid_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) 
        { 
            if (e.ChangedItem.Label == "Age" && !IsAgeValid((int)e.ChangedItem.Value) ) 
            { 
                // the entered age value is wrong - show error message 
                e.ChangedItem.PropertyDescriptor.SetValue( propertyGrid.SelectedObject, e.OldValue); 
                MessageBox.Show("Wrong age", "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
            } 
        } 
 
        ///<summary>
        /// Determines whether age is valid 
        /// </summary>  
        /// <param name="age">The age.</param>  
        /// <returns>  
        /// <c>true</c> if is age valid ; otherwise, <c>false</c>. 
        /// </returns>  
        private static bool IsAgeValid( int age ) 
        { 
            return ((age > 0) && (age < 150)); 
        } 
    } 
}

 

Technorati tags: propertygrid, dotnet, programming

Interesting blog posts

Jon Galloway – Google Personalized Homepage (IG) – Read a post inline

David Hayden – Validation Application Block Presentation and New Features – Enterprise Library 3.0

ScottGu’s Blog – ASP.NET AJAX 1.0 Released

Dmitryr’s blog – Finding out the current trust level in ASP.NET

Michael’s Blog – Transforms, Opacity Masks and Animation to Create an Animated Reflection in WPF/E

 

Technorati tags: blogging, programming, c#, asp.net

The second CTP of Enterprise Library 3.0 is now available to download

Tom Hollander has posted that the second CTP of Enterprise Library 3.0 is now available to download on CodePlex community site.

New In This Release

  • Validation Application Block
    • Near-complete validator library
    • Configuration tool support
    • ASP.NET integration
    • Winforms integration
    • Quickstarts and preliminary documentation
  • Data Access Application Block
    • TransactionScope enlistment
  • Logging Application Block
    • Rolling Flat File Trace Listener
    • WCF integration
  • Application Block Software Factory
    • VB code generation
  • Configuration Tool
    • Selectable assembly sets

 

Technorati tags: dotnet, c#, development, library


Page 16 of 59« First...10...1415161718...304050...Last »