Click here to Skip to main content
15,886,095 members
Articles / Desktop Programming / MFC

How to easily navigate and edit a list view control

Rate me:
Please Sign up or sign in to vote.
2.83/5 (12 votes)
8 Jan 2004CPOL4 min read 82.6K   690   24   5
How to easily navigate and edit a list view control

Introduction

We have a list view control; the task is to write simple code to help in navigating through the controls like how one navigates in an excel sheet, also we need edit the individual cells of the list view control again just like how we edit in an excel sheet. When I started to look for solutions over the net I found out the code to do such a thing was quite complicated, though it ultimately achieved what I set out for. I started to write my own code and my main objective was to keep it as simple as possible while achieving the expected results.

How does the control work?

First run the application, a list view control (3 rows by 9 columns) will appear in a dialog application. Press tab and a combo box appears in the first column, first row of the list View control. Pressing tab again will make the combo box to disappear and an edit box to appear in the second column, and so on. For navigating backwards you need to press shift+ tab. If you click anywhere except in the header and the last column (4th) in the list control a corresponding control will appear. Scrolling the mouse will make all controls disappear; using the scroll bars will also have a similar effect. As soon as the control is removed from a cell its contents are copied into the cell. I think the very basic necessities of a navigatable-editable list view control are satisfied.

How simple is the code?

Like many times before I will explain what am doing here. After you shoot up a dialog application and put a list view control in it. Derive a class from CListCtrl I even derived classes from CEdit and CComboBox just in case I need more control on the controls however I do not make any use of it. I define the following global variables

CMyEdit *m_pedit = NULL;
CMyCombo *m_pcombo = NULL;
int row =0;
int col =-1;

The OnInitDialog() function contains some standard code to get the List view control up and running. I declare the following public functions in the CMyListCtrl the class derived from CListCtrl

LRESULT OnEdit();
LRESULT OnCombo();
void OnSetText();

Use PreTranslateMessage(...) to accommodate for TAB and SHIFT+TAB keys. After the row column management is done I call these three functions

  • VerifyScrollPos();
  • vResetTopPosition();
  • vResetBottomPosition();.

The first one sets the scroll bar position to get the control into view if required. I have presented various flavours of this feature. The code is there and it commented out. The second adjusts the top position of the control, if it by chance goes above the header control. The third does the same to manage the position of the control if it goes below the Listview control. Remember that I do a SendMessage and not a PostMessage, because I need to wait till the scrolling is over. The code then proceeds to do switch on the col variable.

I have pre-assigned the first column for combo boxes the second and third for edit boxes. So here is where I call OnEdit() or the OnCombo(). The OnCombo() function checks to see if the m_pcombo is NULL . If it is NULL then no combo box is created it proceed to create one whose parent is the Listview control. and places it at the current row, col coordinates. If Edit box is already created it just moves it to its current row, col coordinates. The OnSetText() function just takes the current control's text and writes it on the current cell.

Then I handle the NM_CLICK message handler of the list view control to make a control disappear from its previous position and appear in the clicked position, this is done in OnClick(...). The LVN_COLUMNCLICK message is handled to make all the controls disappear. OnNotify(..) function prompts me when ever the user is trying to resize a column of the List view control, I grab the opportunity and hide all the controls so that the next time the can appear with new sizes. I have tested to my heart’s content and found that the behaviour is as close to that of an excel sheet. There might be still some bugs please feel free to fix them and notify me afterwards.

License

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


Written By
Web Developer
India India
I have a PhD in pure mathematics from HCU. I have been programming in Microsoft technologies for more than a decade. My interests are C#, WPF Silverlight, MFC, COM.

Comments and Discussions

 
Generaloh Pin
kedypen26-Dec-05 3:40
kedypen26-Dec-05 3:40 
Generalnice shoot Pin
sreejith ss nair8-May-05 17:58
sreejith ss nair8-May-05 17:58 
Generaljust look at yr articles in codeguru.com, this time u show yr stuff in codeproject Pin
Anonymous9-Jan-04 1:46
Anonymous9-Jan-04 1:46 
GeneralRe: just look at yr articles in codeguru.com, this time u show yr stuff in codeproject Pin
Anonymous9-Jan-04 6:07
Anonymous9-Jan-04 6:07 
GeneralRe: just look at yr articles in codeguru.com, this time u show yr stuff in codeproject Pin
armentage9-Jan-04 6:09
armentage9-Jan-04 6:09 

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

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