Objective Grid: Having more than 32 items in CGXCheckListComboBox

Article ID: 536
Last updated: 16 Apr, 2018
Article ID: 536
Last updated: 16 Apr, 2018
Revision: 3
Views: 2584
Posted: 10 Jan, 2001
by Meltreger B.
Updated: 16 Apr, 2018
by Meltreger B.

Problem


I can't get more than 32 items to work correctly in CGXCheckListComboBox. Is this because of the fact that it uses a bitmapped integer (32 bit long) to pass the choices around? How can I get around this?


Cause



Action


There are many alternatives when you subclass CGXCheckListComboBox. Here are two solutions we found very convenient:

  1. Subclass CGXCheckListComboBox and store the checked state in a hash table that you attach to the style object through SetItemDataPtr().
  2. Subclass CGXCheckListComboBox and store each choice list entry separated by a comma as value in the cell.

Solution a: Subclass CGXCheckListComboBox and store the checked state in a hash table that you attach to the style object through SetItemDataPtr().

//.h file

//CMyCheckListComboBox control
class CMyCheckListComboBox : public CGXCheckListComboBox
{

DECLARE_CONTROL(CMyCheckListComboBox)
public:
CMyCheckListComboBox(CGXGridCore* pGrid, UINT nEditID = 0, UINT nListBoxID = 0);

// Overridden these methods
virtual void OnStoreDroppedList(CListBox* lbox);
virtual void OnFillDroppedList(CListBox* lbox);

};

//.cpp file

#include <afxtempl.h> //include this for CMap template defenition

IMPLEMENT_CONTROL(CMyCheckListComboBox,CGXCheckListComboBox)

CMyCheckListComboBox::CMyCheckListComboBox(CGXGridCore* pGrid, UINT nEditID, UINT nListBoxID)

: CGXCheckListComboBox(pGrid, nEditID, nListBoxID)
{

}

void CmyCheckListComboBox::OnStoreDroppedList(CListBox* lbox)
{

CGXStyle style = Grid()->LookupStyleRowCol(m_nRow, m_nCol);
CGXCheckListComboLBox* checklbox = (CGXCheckListComboLBox*) lbox;

ASSERT(checklbox->IsKindOf(RUNTIME_CLASS(CGXCheckListComboLBox)));

//This is the CMap template that you should attach to
// the style object through SetItemDataPtr
CMap<int,int, BOOL,BOOL> *myMap;
myMap = (CMap<int, int, BOOL, BOOL>*)style.GetItemDataPtr();

if(myMap == NULL)

myMap = new CMap<int, int, BOOL, BOOL>;
// Save the selection
// enable choices
//Clean up the existing map before you store the new value into it
myMap->RemoveAll();
for (int n = 0; n < m_nCount; n++)
{
if (checklbox->GetCheck(n) == 1)
{
myMap->SetAt(n,TRUE);
}
}

style.SetItemDataPtr(myMap);
Grid()->SetStyleRange(CGXRange(m_nRow,m_nCol),style);

}

void CMyCheckListComboBox::OnFillDroppedList(CListBox* lbox)
{

const CGXStyle& style = Grid()->LookupStyleRowCol(m_nRow, m_nCol);
CGXCheckListComboLBox* checklbox = (CGXCheckListComboLBox*) lbox;
ASSERT(checklbox->IsKindOf(RUNTIME_CLASS(CGXCheckListComboLBox)));

CMap<int,int, BOOL,BOOL> *myMap;
myMap = (CMap<int, int, BOOL, BOOL>*)style.GetItemDataPtr();

//You should have attached a CMap template of
//type CMap<int,int, BOOL,BOOL> to the style
// fill with Choices
if (style.GetIncludeChoiceList())
{

CString s = style.GetChoiceListRef();
CString sItem;

// skip first entry in choice list because
//this is the text to be displayed in the cell
int n = GXGetNextLine(s, sItem);
m_nCount = 0;

while (!s.IsEmpty() && n != -1)
{

n = GXGetNextLine(s, sItem);
lbox->AddString(sItem);
m_nCount++;
}
}

// enable choices
if (myMap)
{

BOOL b=FALSE;

for (int n = 0; n < m_nCount; n++)
{

b=FALSE;
myMap->Lookup(n,b);
checklbox->SetCheck(n, b);
}
}
}

Register your control:

RegisterControl(GX_IDS_CTRL_CHECKLIST_COMBOBOX,
new CMyCheckListComboBox(this, 9000,9001/*random id*/));

Set the control in the cell like this:

LPCTSTR szMultiChoiceList = _T("Click Me ")
_T("One ")
_T("Two ")
_T("Three ")
_T("Four ")
_T("Five ")
_T("Six ")
_T("Seven ")
_T("Eight ")
_T("Nine ")
_T("Ten ");
CMap<int,int, BOOL,BOOL> *myMap = new CMap<int,int, BOOL,BOOL>;
myMap->SetAt(1,TRUE);
SetStyleRange(CGXRange().SetRows(nRow+1),
CGXStyle()
.SetControl(GX_IDS_CTRL_CHECKLIST_COMBOBOX)
.SetChoiceList(szMultiChoiceList)
.SetItemDataPtr(myMap)
);

This will check the item "Two" (the list is 0 based).

You can retrieve the checked state of the control using:

CGXStyle style = LookupStyleRowCol(m_nRow, m_nCol);
CMap<int,int, BOOL,BOOL> *myMap = style.GetItemDataPtr();
BOOL b=FALSE;

if(myMap->Lookup(1,b) && b)

TRACE("Item 1 is checked");

Solution b: Subclass CGXCheckListComboBox and store each choice list entry separated by a comma as value in the cell.

Override OnFillDroppedList( ) and OnStoreDroppedList( ) as follows:

void CMyCheckListComboBox::OnFillDroppedList(CListBox* lbox)
{
const CGXStyle& style = Grid()->LookupStyleRowCol(m_nRow, m_nCol);
CGXCheckListComboLBox* checklbox = (CGXCheckListComboLBox*) lbox;
ASSERT(checklbox->IsKindOf(RUNTIME_CLASS(CGXCheckListComboLBox)));

// fill with Choices
if (style.GetIncludeChoiceList())
{

CString s = style.GetChoiceListRef();
CString sItem;

// skip first entry in choice list because
// this is the text to be displayed in the cell
int n = GXGetNextLine(s, sItem);
m_nCount = 0;

while (!s.IsEmpty() && n != -1)
{

n = GXGetNextLine(s, sItem);
lbox->AddString(sItem);
m_nCount++;
}
}

// enable choices
if (style.GetIncludeValue())
{

CString s = style.GetValueRef();
int n = 0;
CString sItem;

while (!s.IsEmpty() && n != -1)
{

n = GXGetNextLine(s, sItem);
checklbox->SetCheck(_ttoi(sItem), TRUE);
}
}
}

void CMyCheckListComboBox::OnStoreDroppedList(CListBox* lbox)
{

CGXCheckListComboLBox* checklbox = (CGXCheckListComboLBox*) lbox;
ASSERT(checklbox->IsKindOf(RUNTIME_CLASS(CGXCheckListComboLBox)));

// Save the selection
// enable choices
CString sValue;
TCHAR sz[20];

for (int n = 0; n < m_nCount; n++)
{

if (checklbox->GetCheck(n) == 1)
{
wsprintf(sz, _T("%d "), n);
sValue += sz;
}
}

Grid()->SetValueRange(CGXRange(m_nRow, m_nCol), sValue);

}

Register your control:

RegisterControl(GX_IDS_CTRL_CHECKLIST_COMBOBOX,
new CMyCheckListComboBox(this, 9000,9001/*random id*/));

Set the control in the cell like this:

SetStyleRange(CGXRange().SetRows(nRow+1),
CGXStyle()
.SetControl(GX_IDS_CTRL_CHECKLIST_COMBOBOX)
.SetChoiceList(szMultiChoiceList)
.SetValue("Two Four ")
);

This will check the item "Two" and "Four".

You can retrieve the checked state of the by looping through the value (with GXGetNextLine( )). This will return all checked items.

This article was:   Helpful | Not helpful
Report an issue
Article ID: 536
Last updated: 16 Apr, 2018
Revision: 3
Views: 2584
Posted: 10 Jan, 2001 by Meltreger B.
Updated: 16 Apr, 2018 by Meltreger B.

Others in this category