Click here to Skip to main content
15,896,606 members
Articles / Programming Languages / C#

SourceGrid - Open Source C# Grid Control

Rate me:
Please Sign up or sign in to vote.
4.94/5 (429 votes)
4 Aug 2013MIT24 min read 5M   23.7K   1K  
SourceGrid is a free open source grid control. Supports virtual grid, custom cells and editors, advanced formatting options and many others features
using System;
using System.Windows.Forms;
using System.Reflection;
using System.Drawing;

namespace SourceGrid
{
	public class CellControl : Cell
	{
		private Control m_Control;
		public Control InnerControl
		{
			get{return m_Control;}
		}
		public CellControl(Control p_Control)
		{
			m_Control = p_Control;
		}
		public CellControl(Control p_Control, PropertyInfo p_Property):this(p_Control)
		{
			BindValueAtProperty(p_Property,p_Control);
		}

//		//propriet� per gestire il link di una cella ad una property
//		private PropertyInfo m_LinkPropertyInfo = null;
//		private object m_LinkObject = null;
//		public void BindValueAtProperty(PropertyInfo p_Property, object p_LinkObject)
//		{
//			m_LinkPropertyInfo = p_Property;
//			m_LinkObject = p_LinkObject;
//		}
//		public void UnBindValueAtProperty()
//		{
//			m_LinkPropertyInfo = null;
//			m_LinkObject = null;
//		}

		protected override void OnAddToGrid(EventArgs e)
		{
			base.OnAddToGrid(e);
			RecalcControlSize();
			RecalcControlPosition();
			Grid.Controls.Add(m_Control);
			m_Control.BringToFront();
		}

		protected override void OnRemoveToGrid(EventArgs e)
		{
			base.OnRemoveToGrid(e);

			//.Net bug : application doesn't close when a active control is removed from the control collection
			// change the focus first
			Grid.SetFocusOnCellsContainer();
			Grid.Controls.Remove(m_Control);
		}

		public virtual void RecalcControlPosition()
		{
			Rectangle l_rcClient = DisplayRectangle;
			
			if (m_Control.Location != l_rcClient.Location)
				m_Control.Location = l_rcClient.Location;
		}
		public virtual void RecalcControlSize()
		{
			Rectangle l_rcClient = DisplayRectangle;
			
			if (m_Control.Size != l_rcClient.Size)
				m_Control.Size = l_rcClient.Size;
		}

		public override void InvokePaint(PaintEventArgs e, Rectangle p_AbsoluteRectangle, bool p_bChekIfIsRegion)
		{
			//non chiamo il Paint della cella perch� il controllo si occupa di disegnare
			RecalcControlPosition();
			RecalcControlSize();
		}

//		public override object Value
//		{
//			get
//			{
//				if (m_LinkPropertyInfo != null)
//					return m_LinkPropertyInfo.GetValue(m_LinkObject,null);
//				else
//					return base.Value;
//			}
//			set
//			{
//				if (m_LinkPropertyInfo != null)
//					m_LinkPropertyInfo.SetValue(m_LinkObject,value,null);
//				else
//					base.Value = value;
//			}
//		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The MIT License


Written By
Software Developer
Italy Italy
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions