Environment: Controls, Visual C++
Introduction
When I had to use the flexgrid for the first time, I was 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
- 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 use the Insert button to add it to your project. You can now see the FlexGrid control in the resource editor’s CONTROLS toolbar.
- Add it to your dialog as you usually add a control.
- Then, set the properties as you want them to be. Right-click on the grid and select the Properties option. Change the settings there as per your requirements.
- Add a member variable for that grid; for example,
m_Grid
. The sample given below is an example. Use it as a guideline to make your application. - It’s better to clear the flexgrid before you do any operations on it. To do that, use:
- To add records to the Grid, use something like this:
- To retrieve data from the Grid when the user double-clicks on a record, use the class wizard to add a double-click message handler for the grid. Assuming that you have named the function
OnDblClickGrid
, then:void YourDialog::OnDblClickGrid() { // Get the current row and column int nRow = m_Grid.GetRow(); int nCol = m_Grid.GetCol(); CString strName,strRemarks; // Get data from the First Column strName = m_Grid.GetTextMatrix(nRow,nCol+0); // Get data from the Second Column strRemarks = m_Grid.GetTextMatrix(nRow,nCol+1); }
- To move to the previous record, do this:
- To go to the Next record, do the reverse of the code above. Instead of
m_Grid.SetRow(--NextRow)
, it would bem_Grid.SetRow(++NextRow)
.
m_Grid.Clear();
CString strName,strRemarks; m_nCount = 0; // Clear and refresh the grid m_Grid.Clear(); m_Grid.Refresh(); // Get the value for strName from the database here // Get the strRemarks from the database here m_nCols = m_Grid.GetCols(); m_Grid.SetTextArray(0, "Name "); // First Column m_Grid.SetTextArray(1, "Remarks " ); // Second Column m_nCount++; // Fill First Column m_Grid.SetTextArray( m_nCols * m_nCount + 0,strName ); // Fill Second Column m_Grid.SetTextArray( m_nCols * m_nCount + 1, strRemarks ); // Redraw the grid m_Grid.SetRedraw(TRUE); m_Grid.Refresh();
void YourDialog::OnBtnPrevious() { m_Grid.SetRedraw(FALSE); // Get the current selection int NextRow = m_Grid.GetRowSel(); // If the position is at the last record, return if(NextRow <= 1) { return; } else { long BackColor[2],FontColor[2]; int Column; // The BackColor and the FontColor variables are // manipulated because we want an effect to be given // to the previous record. Here, we are merely // changing the color of the selected row to give // it that effect. 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); } }
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 longer than usual. It would be slower and slower with each build. If you feel this is happeing, check the size of your .rc file. If its size is abnormal—I can’t specify a size because it depends on your project and its resource contents—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 it’s a bug in the 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 “make backups of your .rc file regularly” until it becomes a habit. That’s it. All luck and have a great time.