Introduction
When I had to use the flexgrid for the first time, I was too frustrated to
find out that no proper documentation existed on the net. The ones available
were too complicated for me to understand. And the ones that were easy were in
VB. This article is to help persons who are going to use the flexgrid in their
applications using VC++. Also take a look at the Warning note at the end of this
article.
Implementation
Step 1
First, include the msflexgrid control in the project. To do that :-
- In the VC++ IDE Menu, go to Project->Add To Project->Components and
Controls menu.
- Then , in the dialog box that appears, select Registered ActiveX Controls.
There, You can see a control named "Microsoft Hierarchical FlexGrid
Control...".
- Select that and add it to your project using the Insert button. You can
now see the FlexGrid control in the resource editor's CONTROLS toolbar.
- Add it to your dialog as you add a control usually.
Step 2
Then, set the properties as you want it to be. Right click on the grid and
select the Properties option. Change the settings there as per your
requirements.
Step 3
Add a member variable for that grid. E.g. m_Grid
. The sample given below is
for an example. Use it as a guideline to make your application.
Step 4
Its better to clear the flexgrid before you do any operations on it. To do
that, use :-
m_Grid.Clear();
Step 5
To add records to the Grid, use something like this.
CString strName,strRemarks;
m_nCount = 0;
m_Grid.Clear();
m_Grid.Refresh();
m_nCols = m_Grid.GetCols();
m_Grid.SetTextArray(0, "Name " );
m_Grid.SetTextArray(1, "Remarks " );
m_nCount++;
m_Grid.SetTextArray( m_nCols * m_nCount + 0,strName );
m_Grid.SetTextArray( m_nCols * m_nCount + 1, strRemarks );
m_Grid.SetRedraw(TRUE);
m_Grid.Refresh();
Step 6
To retrieve data from the Grid when the user double clicks on a record, add a
double click message handler for the grid using the class wizard. Assuming that
you have named the function as OnDblClickGrid
, then :-
void YourDialog::OnDblClickGrid()
{
int nRow = m_Grid.GetRow();
int nCol = m_Grid.GetCol();
CString strName,strRemarks;
strName = m_Grid.GetTextMatrix(nRow,nCol+0);
strRemarks = m_Grid.GetTextMatrix(nRow,nCol+1);
}
Step 7
To move to the previous record, do this :-
void YourDialog::OnBtnPrevious()
{
m_Grid.SetRedraw(FALSE);
int NextRow = m_Grid.GetRowSel();
if(NextRow <= 1)
{
return;
}
else
{
long BackColor[2],FontColor[2];
int Column;
BackColor[0] = 0x00FFFFFF;
BackColor[1] = 0x00FFFFB0;
FontColor[0] = 0x00400000;
FontColor[1] = 0x000000FF;
for(Column = 1; Column < m_Grid.GetCols(); Column++)
{
m_Grid.SetCol(Column);
m_Grid.SetCellBackColor(BackColor[0]);
m_Grid.SetCellForeColor(FontColor[0]);
}
m_Grid.SetRow(--NextRow);
for(Column = 1; Column < m_Grid.GetCols(); Column++)
{
m_Grid.SetCol(Column);
m_Grid.SetCellBackColor(BackColor[1]);
m_Grid.SetCellForeColor(FontColor[1]);
}
m_Grid.Refresh();
m_Grid.SetRedraw(TRUE);
}
}
Step 8
To got to the Next record, do the reverse of the code above. Instead of
m_Grid.SetRow(--NextRow)
it would be m_Grid.SetRow(++NextRow)
.
Warning
Whenever you use a flexgrid in your application, you have to be twice as
careful. Be sure to take regular backups. Sometimes, you might note that your
compilation time is too longer than usual. It would be more and more slow with
each build. If you feel so, check the size of your .rc file. If its size is
abnormal ( I cant specify a size because it depends on your project and its
resource contents ),then delete the flexgrid from your application , Close
Visual Studio and copy the .rc file from your backup. Open your project again.
That should solve your problem. I'm not sure why this happens, maybe its a bug
in flexgrid that corrupts or damages it. But from your side, be careful.
Conclusion
The flexgrid is a very easy control to use. But whenever you use it , repeat
the mantra "take backups of your .rc file regularly" until it becomes a
habit. That's it. All luck and have a great time.