A Dual ListBox Selection Manager

I have seen many applications that provide the user with the ability to select
an item from one list and put it into another. One example is the NT User
manager group memberships screen. This is commonly done by placing two
listboxes side by side. Then buttons are generally used to add, add all,
remove, remove all and to move items up and down in the list of choosen
items. Here's a screen shot from my demo application:

I created a class named CDualListManager that handles all of the drudgery of
moving items between the two lists. One list represents the list of available
items and the other represents the list of choosen items (I use the word
choosen instead of selected to avoid any confusion with the hilighted item in
a list). This class is intended to be a member of CDialog, CFormView or
CPropertyPage. All the parent class has to do is properly initialize this
class and call a couple of member functions and this class will take care of
the following things:

- If the "Add" button is pressed the selected item(s) are
moved from the available list to the choosen list.

- If the "Add All" button is pressed all of the items in
are moved from the available list to the choosen list.

- If the "Remove" button is pressed the selected item(s)
are moved from the choosen list to the available list.

- If the "Remove All" button is pressed all of the items in
are moved from the choosen list to the available list.

- If the "Move Up" button is pressed the selected item(s)
in the choosen list are moved up in the list by one.
This button can be pressed repeatedly until all of the
selected items have reached the top of the list. When
that occurs the button is disabled.

- If the "Move Down" button is pressed the selected item(s)
in the choosen list are moved down in the list by one.

- Allows double clicking on an item to move it to the
opposite list.

- When item(s) are moved from one list to another the
item that was moved is selected in the list it was moved
to. The list that had the item removed selects the item
that is at the location of the first item that was moved.
If the item at the bottom of the list is moved the item
immediately above it is selected. If the last item in
the list is removed there is no selection.

- Enabling/disabling of buttons - when items are moved
between lists and up and down in the choosen list the
availability of buttons changes. For instance if an item
is moved to the top of the choosen list the "Move Up"
button doesn't make sense. When this occurs the "Move Up"
button is automatically disabled.

- Keyboard support - disabling a button that has the focus
causes problems for keyboard users. This code checks to
see if a button has the focus before it disables it. If
it does the focus is forwarded to the next avaiabled
control.

How to use this class:

- Add a member variable of this class type to the dialog
box, property page or form view where you want to use it.

- From the initialization method (OnInitDialog() for a
dialog box and a property page and OnInitialUpdate() for
a view) do the following things in this order:

- Add the items to the available and choosen lists with
the calls AddItemToAvailableList(...) and
AddItemToChoosenList(...). The first parameter is the
name of the item and the second parameter is a unique
identifier for the item.

- Call InitializeControls(...) with a pointer the parent
window and the IDs of all of the controls.

- Override OnCmdMsg(...)

Notes:

- If you don't need certain features (like the ability to
move an item up or down in the choosen list) simply
provide a NULL value for that id. The rest of the class
will continue work correctly. The IDs for the two lists
are required since a dual list manager doesn't make sense
unless it has two lists to work with.

- This code will work with single, multiple and extended
listboxes.

- The order of the controls doesn't matter. You can put
the choosen list on the left, right, top or bottom of the
selected list. Just make sure you supply the control IDs
in the right order.

The demo application uses this dual list manager in a form view, a dialog box
and a property page. This code will show how to use it in a form view.

Downloads

Comments

Add Clear and Refill members

Posted by t.buys
on 10/06/2005 06:15am

In my project I need this kind of class in a wizzard mode property sheet. Because the user can switch between the property pages I need some functionality to remove the items from the listboxes and add new items to them. I add two new members: Clear() and Refill().
I also add a boolean m_bIsAttached which is set TRUE after the Attach calls in the InitializeControls(...) member.

void CDualListManager::Clear()
{
if(m_bIsAttached)
{
m_ArrayAvailable.RemoveAll();
m_ArrayChoosen.RemoveAll();
m_KeyMap.RemoveAll();
}
}
void CDualListManager::Refill()
{
if(m_bIsAttached)
{
// Re-fill the listboxes with the contents of the array
FillListboxes();
// Select the first item in each of the listboxes
SelectLBItem(m_ctrlAvailableList, 0);
SelectLBItem(m_ctrlChoosenList, 0);
// Now enable/disable the move buttons based on the contents and selction
// state of the listbox controls.
EnableButtons();
}
}

Update for XP style manifest and flicker

I like this class but there are some little problems.
If using the XP style manifest the buttons sending notify messages even
when not clicked on them. Solution: in ProcessCmdMsg add

if (nCode == BN_CLICKED) { .... }

around the button handlers.
When clicking on the up and down button the Available list is flickering.
To stop that add at member FillListboxes an extra parameter BOOL bUpDown with the
default value FALSE. Add in function

ClistControll

Hell,
i am javaid, from Pakistan. i tested your program. that was good for the begineers. and so that they can explore the window concepts.this realy help someone to motivate on work on the windows.
thankyou

Dueling Data Windows

I see NO drag & drop capability here to select in one of these dueling data windows and then drag to the other one and drop its load onto the other one. Also, be able to insert in the middle of the list of the dropee data window.

Top White Papers and Webcasts

Live Event Date: March 19, 2015 @ 1:00 p.m. ET / 10:00 a.m. PT
The 2015 Enterprise Mobile Application Survey asked 250 mobility professionals what their biggest mobile challenges are, how many employees they are equipping with mobile apps, and their methods for driving value with mobility.
Join Dan Woods, Editor and CTO of CITO Research, and Alan Murray, SVP of Products at Apperian, as they break down the results of this survey and discuss how enterprises are using mobile application management and private …

According to technology research firm Gartner, cloud computing will become the bulk of new IT spend by 20161. By the end of 2017, Gartner predicts that nearly half of large enterprises will have hybrid cloud deployments1. Learn how you can use these trends to your advantage by offering cloud and hybrid data solutions to your customers.