Click here to Skip to main content
Click here to Skip to main content

DataGrid Control

, 5 Aug 2005 CPOL
Rate this:
Please Sign up or sign in to vote.
An article on a grid control built without MFC.

Example on using DataGrid control


This article presents a DataGrid control which is built with no MFC. It can be used in SDK or MFC Win32 applications. This source code is also compiled with GNU compiler and has shown to be stable.


You can find various grid controls all over the Internet, some free and some not. Also, there is an article by Chris Maunder about a grid control which can be used on different platforms (ATL and MFC version). Grid controls are very useful for representing two-dimensional tabular data. They are often used in accounting applications. Grid controls must be designed for quick data-referencing and modification. The grid control presented in this article supports up to 32000 rows and 1000 columns. Also, there can be up to 20 grid controls created at the same time. These values can be changed in the DataGrid header file but there is always a memory limit.

Using the code

To use the DataGrid control a header file must be included in the project.

#include "DataGrid.h"

Next, create an instance of the CDataGrid class and call the Create() method.

// hParentWnd is declared somewhere else
CDataGrid dataGrid;
int numCols = 5;
RECT rect = {0,0,500,300};
dataGrid.Create( rect, hParentWnd, numCols );

Use SetColumnInfo() method to describe the DataGrid control columns.

int colIndex = 0;
char colText[] = "Column1";
int colSize = 120;
UINT txtAlign = DGTA_LEFT;
dataGrid.SetColumnInfo( colIndex, colText, colSize, txtAlign );

To add items to the DataGrid control, call InsertItem() method.

char itemText[] = "Item1";
dataGrid.InsertItem( itemText, txtAlign );

To describe subitems, use SetItemInfo() method.

int rowIndex = 0;
int columnIndex = 0;
char subitemText[] = "Subitem1";
bool readOnly = false;
dataGrid.SetItemInfo( rowIndex, columnIndex, subitemText, txtAlign, readOnly );

The DataGrid control sends notification messages through the WM_COMMAND message. These notifications are:

  • Item changed
  • Item text changed
  • Item added
  • Item removed
  • Column resized
  • Column clicked
  • Sorting started
  • Sorting ended

This is the basic use of this control. See the demo project as an example. The DataGrid control supports the following:

  • Grid show (on/off)
  • Column resize (on/off)
  • Item text edit (on/off)
  • Items sorting (on/off)
  • Get/set row background color
  • Get/set row text color
  • Get/set row font
  • Get/set column text color
  • Get/set column font
  • Set application-defined sort function

Points of Interest

My goal was to try to develop a grid control that will support most of the things that the MFC CListCtrl control does and possibly some more and to be as efficient. Its GUI is designed to be very similar with the previously mentioned control.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Software Developer (Senior) Elektromehanika d.o.o. Nis
Serbia Serbia
He has a master degree in Computer Science at Faculty of Electronics in Nis (Serbia), and works as a C++/C# application developer for Windows platforms since 2001. He likes traveling, reading and meeting new people and cultures.

Comments and Discussions

Questionhow to scrol datagrid PinmemberGener47210-Dec-14 4:06 
QuestionErrors remove and update version, can be downloaded here [modified] Pinmembermaplewang4-Nov-14 6:52 
Questiondatagrid Pinmembernibble_bits16-Jul-13 8:07 
GeneralMore memory leaks.... Pinmemberdc_20001-Apr-11 13:39 
GeneralWow, this thing leaks memory like a seive Pinmemberdc_200024-Mar-11 10:36 
OK, that poster before me was able to find the memory leak too, he just didn't have enough brains to post it here in a readable form so that everyone could just copy it (without editting out his comments). So once again here you go, to fix the memory leak replace the DestroyDGGrid() method in the code with this:

void DestroyDGGrid(HWND hWnd)
	DG_LIST* dgList = DetachDGGrid(hWnd); 
	if ( dgList != NULL ) 
		// Delete columns 
		if ( dgList->dg_Columns ) 
			delete [] dgList->dg_Columns; 
			dgList->dg_Columns = NULL; 
		// Delete Items - hochan Added 
		for(int i = 0; i< dgList->dg_RowNumber; i++) 
			for ( int j=0; j< dgList->dg_ColumnNumber; j++ )
				delete [] dgList->dg_Rows[i].rowText[j]; 
			delete [] dgList->dg_Rows[i].rowText; 
			delete [] dgList->dg_Rows[i].textAlign; 
			delete [] dgList->dg_Rows[i].readOnly; 
		 // Delete rows 
		dgList->dg_Rows = NULL; 
		// Delete column font 
		if ( dgList->dg_hColumnFont ) 
			dgList->dg_hColumnFont = NULL; 
		// Delete row font 
		if ( dgList->dg_hRowFont ) 
			dgList->dg_hRowFont = NULL; 
		 // Delete background brush 
		if ( dgList->dg_hBgBrush ) 
			dgList->dg_hBgBrush = NULL; 
		// Delete cell pen 
		if ( dgList->dg_hCellPen ) 
			dgList->dg_hCellPen = NULL; 

		// Delete memory device context 
		if ( dgList->dg_hMemDC ) 
			SelectObject( dgList->dg_hMemDC, dgList->dg_hOldMemBitmap ); 
			dgList->dg_hMemDC = NULL; 
		// Delete memory bitmap 
		if ( dgList->dg_hMemBitmap ) 
			dgList->dg_hMemBitmap = NULL; 
		delete dgList; 

PS. And a note for the author, please include this in the source...
Questionmemory leaks PinmemberRonWilsonCPP11-Aug-10 22:15 
AnswerRe: memory leaks [modified] Pinmembermaplewang7-Dec-10 19:24 
GeneralLogical Flaw PinmemberJosephHong31-Jul-09 23:00 
GeneralRe: Logical Flaw Pinmemberdc_200025-Mar-11 15:48 
AnswerControl Not Displaying Bug and Fix PinmemberDrew_Benton8-Apr-08 0:54 
QuestionLicense? Pinmemberrecyclotron20-Feb-08 6:22 
QuestionNice and useful Pinmemberspyto30-Nov-07 4:51 
QuestionHow to resize the Datagrid? Pinmemberlurvhua26-Nov-07 19:17 
AnswerRe: How to resize the Datagrid? PinmemberAjm11330-Dec-09 8:48 
Generala bug Pinmemberclxye8-Oct-07 18:24 
QuestionHow to delete a column? Pinmemberclxye27-Sep-07 23:16 
AnswerRe: How to delete a column? Pinmemberoldmoon27-Sep-07 23:37 
GeneralRe: How to delete a column? Pinmemberclxye28-Sep-07 16:01 
GeneralRe: How to delete a column? Pinmemberoldmoon29-Sep-07 16:35 
AnswerRe: How to delete a column? Pinmemberclxye28-Sep-07 21:47 
GeneralProblem In Unicode Pinmemberlurvhua30-Aug-07 23:08 
GeneralRe: Problem In Unicode Pinmemberdarkoman31-Aug-07 13:12 
GeneralRe: Problem In Unicode Pinmemberlurvhua2-Sep-07 1:18 
Generalmultiple row selection Pinmemberadii289-Jul-07 7:43 
GeneralRe: multiple row selection Pinmemberdarkoman9-Jul-07 20:14 
QuestionHow to get the number of specific row Pinmembereryreyeryeryeryeyryye17-May-07 7:46 
Questionmultiple instances Pinmemberhopsoid19-Nov-06 16:37 
GeneralQuestion about simple applikation Pinmemberwoj11727-Jul-06 9:40 
NewsA bug Pinmemberkingren3-Jul-06 16:25 
QuestionHidden Rows PinmemberRickomurphy27-Jun-06 5:13 
AnswerRe: Hidden Rows Pinmemberdarkoman27-Jun-06 6:14 
GeneralRe: Hidden Rows PinmemberRickomurphy27-Jun-06 6:53 
GeneralNice PinmemberSharpmike17-Jun-06 20:31 
GeneralRe: Nice Pinmemberdarkoman17-Jun-06 21:25 
GeneralSome more wishes... Pinmemberwoj11713-Mar-06 5:31 
GeneralRe: Some more wishes... Pinmemberdarkoman13-Mar-06 21:33 
GeneralRe: Some more wishes... Pinmemberwoj11713-Mar-06 23:28 
GeneralCDataGrid difficulties in SDI Pinmemberlukeevans9-Mar-06 0:49 
GeneralRe: CDataGrid difficulties in SDI Pinmemberdarkoman12-Mar-06 20:31 
GeneralRe: CDataGrid difficulties in SDI Pinmemberlukeevans13-Mar-06 20:24 
GeneralSome improves PinmemberWiseWarrior5-Jan-06 0:06 
GeneralRe: Some improves Pinmemberdarkoman5-Jan-06 2:03 
GeneralRe: Some improves PinmemberWiseWarrior6-Jan-06 21:45 
GeneralRe: Some improves Pinmemberdarkoman6-Jan-06 22:39 
GeneralAnother Bug too! PinmemberLove In Snowing11-Jul-05 3:02 
GeneralRe: Another Bug too! Pinmemberdarkoman21-Jul-05 2:20 
GeneralThis code does not work! PinmemberPJ Arends10-Jul-05 12:45 
GeneralRe: This code does not work! Pinmemberdarkoman21-Jul-05 2:21 
GeneralAnother bug PinmemberDavid O'Neil9-Jul-05 9:49 
GeneralRe: Another bug Pinmemberdarkoman21-Jul-05 2:23 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.150331.1 | Last Updated 5 Aug 2005
Article Copyright 2005 by darkoman
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid