Navigating through CListCtrl’s rows with the arrow and tab keys

Environment: Demo was created with Visual C++ 6.0


I needed to be able to edit some fields from a database, and wanted to have a label,
the field name, followed by an edit box that the user could enter the field data in.
The only problem was that there could be anywhere from 1 to 50 fields. So I used
a CListCtrl with two columns to represent the field name and the field value. There
are many articles here that show how to edit subitems, but I only needed to be able to
edit one item on each row, so I just rearranged the columns to have the editable item
be the second cloumn. The following code is all that is necessary to rearrange the

int aiCol[2] = { 1, 0 };
m_List.SetColumnOrderArray (2, aiCol);

I also needed the user to be able to navigate through the fields with the tab and arrow
keys. This was a pain because the CListCtrl creates its own edit box for editing items,
and it was stealing all the key strokes that I wanted. I did not want to have to draw
and manage my own edit box, so I just created my own CEdit based class and subclassed
the edit box created by the CListCtrl. To subclass the edit control with your own edit
control, m_Edit, all you need is:

Inside a message handler for the LVN_BEGINLABELEDIT message, you need to add the following code:

ASSERT (hWnd != NULL);
if (m_Edit.m_hWnd != 0)
m_Edit.DestroyWindow ();
VERIFY (m_Edit.SubclassWindow (hWnd));

Inside a message handler for the LVN_ENDLABELEDIT message, you need to add the following code:

if (m_Edit.m_hWnd)
VERIFY (m_Edit.UnsubclassWindow () != NULL);

You can then add a message handler in your m_Edit class to catch the KeyDown event and then
begin editing the next item.

The example program is simply a dialog box with an CListCtrl drawn on it. Ten fields are added
in the OnInitDialog function to illustrate this functionality.

Download demo – 19 KB

Date Last Updated: April 24, 1999

More by Author

Must Read