CListView not inserting items
Hi,
I have an app (ie. Windows Explorer style) with a tree view, that
should update the list view with names when items are selected in it. I
cannot get the list view to show any values other than the column
headings. I've tried using LVITEM, calls to SendMessage with the
appropriate parameters, even tried using the ListView_ routines. I've
searched the group for solutions, tried some but they didn't work. I'm
pretty much stuck now, so any help in understanding why this problem is
occurring and a solution to it is much appreciated.
Here is some sample code. The class CefsmView inherits from CListView.
The problem is setting the values in the list view, see method
CefsmView::Populate(...) below which is called from
CefsmView::OnUpdate(...).
CefsmView::CefsmView() : mobjListCtrl(GetListCtrl())
{
}
BOOL CefsmView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style |= LVS_SHOWSELALWAYS | LVS_REPORT;
return CListView::PreCreateWindow(cs);
}
void CefsmView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
LONG dwStyle;
dwStyle = WS_TABSTOP |
WS_CHILD |
LVS_AUTOARRANGE |
LVS_REPORT |
LVS_EDITLABELS |
LVS_SHAREIMAGELISTS |
WS_VISIBLE;
mobjListCtrl.ModifyStyle(mobjListCtrl.GetStyle(), dwStyle);
}
int CefsmView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CListView::OnCreate(lpCreateStruct) == -1)
return -1;
// Setup the columns
CHeaderCtrl * hc = mobjListCtrl.GetHeaderCtrl();
HDITEM hdi;
hdi.mask = HDI_TEXT | HDI_WIDTH | HDI_FORMAT | HDF_IMAGE;
// Insert columns into header control
CString str;
for (int i = 0; i < 5; i++)
{
switch (i)
{
case 0:
str.Format(TEXT("Header1"), i);
hdi.fmt = HDF_STRING | HDF_LEFT;
break;
case 1:
str.Format(TEXT("Header2"), i);
hdi.fmt = HDF_STRING | HDF_RIGHT;
break;
case 2:
str.Format(TEXT("Header3"), i);
hdi.fmt = HDF_STRING | HDF_LEFT;
break;
case 3:
str.Format(TEXT("Header4"), i);
hdi.fmt = HDF_STRING | HDF_LEFT;
break;
case 4:
str.Format(TEXT("Header5"), i);
hdi.fmt = HDF_STRING | HDF_RIGHT;
break;
}
hdi.pszText = str.GetBuffer(0);
// Insert the header
hc->InsertItem(i, &hdi);
// Autosize the column widths
mobjListCtrl.SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER);
}
return 0;
}
void CefsmView::Populate(const CString & sItemName)
{
// sItemName is being passed into the method ok
Reset();
// Note: For some reason, if I insert a column
// into the list view, then it will actually
// insert items into that column. But the code
// below does not insert items into existing
// columns
int nItem = mobjListCtrl.InsertItem(0, sItemName);
BOOL bStatus = mobjListCtrl.SetItemText(nItem, 1, "SI 1");
CheckStatus(bStatus);
bStatus = mobjListCtrl.SetItemText(nItem, 2, "SI 2");
CheckStatus(bStatus);
bStatus = mobjListCtrl.SetItemText(nItem, 3, "SI 3");
CheckStatus(bStatus);
bStatus = mobjListCtrl.SetItemText(nItem, 4, "SI 4");
CheckStatus(bStatus);
bStatus = mobjListCtrl.SetItemText(nItem, 5, "SI 5");
CheckStatus(bStatus);
UpdateWindow();
}
void CefsmView::CheckStatus(const BOOLEAN bStatus)
{
if (bStatus == FALSE)
{
AfxMessageBox(static_cast<CString>("Unsuccessful."),
MB_ICONINFORMATION|MB_OK);
}
}
void CefsmView::Reset(void)
{
mobjListCtrl.DeleteAllItems();
while(objListCtrl.DeleteColumn(0));
UpdateWindow();
}
void CefsmView::OnUpdate(CView* pSender,
LPARAM lHint,
CObject* pHint)
{
CListView::OnUpdate(pSender, lHint, pHint);
CString s = reinterpret_cast<LPCSTR>(pHint);
if (!s.IsEmpty())
{
Populate(s);
}
}
Regards,
Michael