Multi column Combo box (2)

First, I want to say, that I saw the article Multicolumn Combobox by Jakawan Ratiwanich, on www.codeguru.com. I inspected the piece of code, and I noticed that exist a array of items. That combo do not accept more than 200 items. In my mind, this is a inconvenient issue. So, I started to create a class CMultiColumnComboBox. Dealing with that very easy. The listbox of original combobox was replaced with a CListCtrl, so, when you will click in button's combo a lsitctrl will appear on the screen.

How user can use this control?

  1. Put in your resource dialog, a custom control, with window class name: MultiColumnComboBox.
  2. Add a new member in dialog class m_combo as CMultiColumnComboBox.
  3. In OnInitDialog subclass this member with
    m_combo.SubclassDlgItem(IDC_CUSTOM1, this),
    
    where IDC_CUSTOM1 is the ID of control in dialog.

How do you insert items?

Very easy. Here a snnipet code to insert:

    CListCtrl* pList = m_combo.GetListCtrl(); // call this function to retieve the listcontrol inside. 
    pList->InsertColumn(0, _T("Col 1"), LVCFMT_LEFT, 48); 
    pList->InsertColumn(1, _T("Col 2"), LVCFMT_LEFT, 48); 
    ... 

As you see, filling control with items is in fact filling the list control. Now the control is ready to use.

Notes:

- If the use want to add checkboxes to the lis control, he can call the following function:
ListView_SetExtendedListViewStyle(m_combo.GetListCtrl()->m_hWnd,
                                  LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES ); 

By default, the extended styles of listcontrol are : LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT.

If you need more help, free feel to ask me.

Download demo project - 31 KB

Download source - 6.6 KB



Comments

  • How to use it's list in virtual mode to show 60000+ items (Win98) ?

    Posted by anand_study on 11/28/2006 08:18am

    This is a very nice control. Thanks. Any one tried to use list control of this multi-column combo ? I need to use it's list in virtual mode to show 60000+ items (Win98) ? Thanks for any help/hint. Anand

    Reply
  • List control with header

    Posted by molostov on 06/29/2005 03:59pm

    If list has header and the last item is selected, GetCurrentItem() returns -1.

    Reply
  • Proportionnal to Font Size? 2000 ?

    Posted by Legacy on 10/16/2001 12:00am

    Originally posted by: Michel DAVID

    Hi Mihai.

    I am interrested to know
    1) Does it work on 2000/XP ?
    2) Is it possible to make it higher (That means DY bigger) according to the Dialog font, like a regular CB that grows when the dialog font grows.

    Thank you very much.

    Michel DAVID
    MARNET

    Reply
  • a question

    Posted by Legacy on 09/28/2001 12:00am

    Originally posted by: Assia

    i need some help for creating a combo Box which control the item of a second Dialog Box on the same dialog.

    Unfortunatelly i hd an error occure for every try i made.

    Can someone help me for that.

    thank you in advance.

    Assia from Paris

    Reply
  • mouse wheel is not captured

    Posted by Legacy on 07/03/2001 12:00am

    Originally posted by: Ivaylo G.

    Hi Mihai,
    Thanks for control it is very practical!

    But I find some small bug about mouse wheel. When I use it, that is not captured from control but for dialog window.
    Can you give me some idea for that problem.

    Ivailo


    Reply
  • Minor bug in search

    Posted by Legacy on 10/13/2000 12:00am

    Originally posted by: Cesco

    The search always begins from the first element, so if two items share the same text the second is never found. Very simple solution: add an int member variable like m_last initialized as -1 in the constructor and modify the Search method like this:
    
    void CMultiColumnComboBox::Search(LPCTSTR lpszFindItem)
    {
    if (CListCtrl* pListCtrl = GetListCtrl())
    {
    LV_FINDINFO fInfo;
    fInfo.flags = LVFI_PARTIAL | LVFI_STRING;
    fInfo.psz = lpszFindItem;
    TRACE("Last was %d\n", m_last);
    int nItem = pListCtrl->FindItem(&fInfo, m_last);
    m_last = nItem;
    SetCurrentItem(nItem);
    pListCtrl->EnsureVisible(nItem, FALSE);
    }
    }
    By the way: Very cool control.

    Reply
  • Minor bug in search

    Posted by Legacy on 10/13/2000 12:00am

    Originally posted by: Cesco

    The search always begins from the first element, so if two items share the same text the second is never found. Very simple solution: add an int member variable like m_last initialized as -1 in the constructor and modify the Search method like this:
    
    void CMultiColumnComboBox::Search(LPCTSTR lpszFindItem)
    {
    if (CListCtrl* pListCtrl = GetListCtrl())
    {
    LV_FINDINFO fInfo;
    fInfo.flags = LVFI_PARTIAL | LVFI_STRING;
    fInfo.psz = lpszFindItem;
    TRACE("Last was %d\n", m_last);
    int nItem = pListCtrl->FindItem(&fInfo, m_last);
    m_last = nItem;
    SetCurrentItem(nItem);
    pListCtrl->EnsureVisible(nItem, FALSE);
    }
    }
    By the way, Very cool control.
    Cesco

    Reply
  • i want this control!!

    Posted by Legacy on 04/30/2000 12:00am

    Originally posted by: Mark Axmann

    I'm working on VB project that needs this control. How can I get a compiled .ocx of this control?? Or a VB code version.


    Thanks.
    Mark

    Reply
  • When in Combobox, Alt+F4 doesn't close the main window

    Posted by Legacy on 06/10/1999 12:00am

    Originally posted by: Magnus Johansson

    When in the customized combobox, Alt+F4 doesn't close the main window.
    Instead, it opens up the listbox.

    Why is that ?

    Reply
  • Very small change - Make it select EditBox contents when item selected:

    Posted by Legacy on 06/02/1999 12:00am

    Originally posted by: Bryan Napier

    Just one very minor thing to add to make it more like a combo box..  With a combobox, when you select an item
    from the listbox, the contents are copied to the editbox and then selected...  Here is my little change to do
    the same:
    
    

    void CMultiColumnComboBox::SelectCurrentItem()
    {
    int nIndex = GetCurrentItem();
    GetEdit()->SetWindowText(GetListCtrl()->GetItemText(nIndex, m_nColumnKey));\
    GetEdit()->SetSel(0, -1); // added by Bryan Napier, select entire edit box contents, like a real combo box
    //Notify the parent that one item was changed
    if (nIndex >= 0)
    if (CWnd* pParent = GetParent())
    pParent->SendMessage(m_nSelChange, (WPARAM)GetDlgCtrlID(), (LPARAM)m_hWnd);
    }

    Very remedial but who knows, might save someone 2 seconds!

    Reply
  • Loading, Please Wait ...

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

Top White Papers and Webcasts

  • The explosion in mobile devices and applications has generated a great deal of interest in APIs. Today's businesses are under increased pressure to make it easy to build apps, supply tools to help developers work more quickly, and deploy operational analytics so they can track users, developers, application performance, and more. Apigee Edge provides comprehensive API delivery tools and both operational and business-level analytics in an integrated platform. It is available as on-premise software or through …

  • Live Event Date: September 16, 2014 @ 11:00 a.m. ET / 8:00 a.m. PT Are you starting an on-premise-to-cloud data migration project? Have you thought about how much space you might need for your online platform or how to handle data that might be related to users who no longer exist? If these questions or any other concerns have been plaguing you about your migration project, check out this eSeminar. Join our speakers Betsy Bilhorn, VP, Product Management at Scribe, Mike Virnig, PowerSucess Manager and Michele …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds