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 columns.


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:

HWND hWnd = (HWND)SendMessage (LVM_GETEDITCONTROL);
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



Comments

  • Different Way

    Posted by Legacy on 06/27/2001 12:00am

    Originally posted by: KalliMan

    Hi, 
    
    Do You Know A Different Way To Do That, I Mean, Without
    "SetColumnOrderArray()"?

    Reply
  • Multiple Column?

    Posted by Legacy on 05/21/1999 12:00am

    Originally posted by: Christian

    Do you know how navigate on more that 1 column?
    (right<->left)
    When i press TAB i want go edit the right item and inverse with Shift-TAB.
    thanks

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Take advantage of this on-demand webinar to learn how to deploy Windows apps to all workers, across all devices, with Citrix XenApp and XenDesktop. Additionally, our cloud expert will teach you to create a Windows 10-based VDI implementation and login using Citrix Receiver. Other key takeaways include how to: Deploy a multi–server Citrix XenApp/XenDesktop infrastructure Understand the core capabilities of Citrix on Azure, including virtualizing applications and desktops Register today!

  • Research results provide insight into current DevOps security practices at both large and mid-sized enterprises, and highlight multiple gaps that still exist between the opportunity to have security as a natural part of DevOps and the reality of current implementations.

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date