关于ListCtrl插入项目的菜鸟问题(SetItemText()和InsertItem())在线等候

时间:2022-09-20 06:06:00
我使用ListCtrl插入项目的代码如下
CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_CATEGORY_LISTBOX);
LVITEM lvitem;
lvitem.mask = LVIF_TEXT;
lvitem.iItem = pListCtrl->GetItemCount();
lvitem.iSubItem = 0;
lvitem.pszText = "Name";
pListCtrl->SetItem(&lvitem);
int i = pListCtrl->InsertItem(&lvitem);
pListCtrl->SetItemText(i,0,m_strName.GetBuffer(64));
pListCtrl->SetItemText(i,1,m_strFileType.GetBuffer(64));
pListCtrl->SetItemText(i,2,m_strSaveDirectory.GetBuffer(64));
可每次中保错
请高手帮帮忙!!

10 个解决方案

#1


没人回答吗?

#2


void CLoginPage::AddLogList(long id, char *name, long loginfo,int n)
{
char ch[32];
sprintf(ch,"%x",id);
    //先插入一个Item再说
int iActualItem = m_list.InsertItem(n,ch);

LVITEM item;

item.iItem = iActualItem;
item.mask = LVIF_TEXT;
item.pszText = ch;
item.cchTextMax=32;
strcpy(item.pszText,name);
item.iSubItem = 1;
//修改它的SubItem的Text值
m_list.SetItem(&item);

    switch(loginfo)
{
case 0:
strcpy(item.pszText,"login");
break;
case 1:
strcpy(item.pszText,"logout");
break;
case 2:
strcpy(item.pszText,"reconnect");
break;
}

item.iSubItem = 2;
//修改它的SubItem的Text值
m_list.SetItem(&item);


}

#3


Setitem和Setitemtext的区别能说一下吗?

#4


SetItem 可修改ITEM的属性
SetItemText只能设定其中的字符

CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_CATEGORY_LISTBOX);
LVITEM lvitem;
lvitem.mask = LVIF_TEXT;
lvitem.iItem = pListCtrl->GetItemCount();
lvitem.iSubItem = 0;
lvitem.pszText = "Name";

??????????pListCtrl->SetItem(&lvitem);
?? 出错!

int i = pListCtrl->InsertItem(&lvitem);
pListCtrl->SetItemText(i,0,m_strName.GetBuffer(64));
pListCtrl->SetItemText(i,1,m_strFileType.GetBuffer(64));
pListCtrl->SetItemText(i,2,m_strSaveDirectory.GetBuffer(64));

您可以使用
for( i = 0 ; i < ?? ; i ++ )
{
   InsertItem(i);
   SetItemText(i,0,"hello");
   SetItemText(i,1,"hello");
}

试试

#5


deng hui er lai kan

#6


一样出错
:(

#7


直接insertitem();来插入每行的头节点,
然后setitemtext设置每一行中子节点,
显示输出的话用不着setitem();你都没有插入节就setitem()当然出错了

#8



说句实话您的错误很怪,以至于当我刚看到你的程序时一时也拿不准您的错误究竟在何处。看了那些好心的朋友给您提的意见和方法后我就更

加迷糊了。最后我只好按照你提供的程序重新编了一个程序才发现错误。首先你没有弄清各控件的功能。系统提供了两种列表控件一个是

CListBox,另一个是CListCtrl。CListBox提供的功能很简单,只能显示某个项的列表,用AddString()就可以向列表框加入字符串。
CListCtrl提供的功能就相对丰富,它能显示图标视图,小图标视图,列表视图和报告试图。从您的程序代码来看,我判断你是想用CListCtrl

控件,但从你调用ID的方式来看(CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_CATEGORY_LISTBOX);),我又觉得你是在用

CListBox控件。如果你真的是在用CListBox控件的话,那就真是错了十万八千里了,因为CListBox根本就无法显示头标和子项这些东西。应该

用CListCtrl控件。如果你本来就是用CListCtl控件的,那我向您道歉。但是您的程序代码仍然有错,您忘了用InsertColumn()加入列了,如果

不用该函数加入列,就根本没法显示项和子项了。CLlistCtrl控件通常显示的是图标视图,如果你想显示子项,必须换成报告视图。简单的方

法是在CListCtrl控件的属性中选Style选项,再将Icon改成Report.下面的程序是我在对话框的OnInitDialog()函数中初始化CListCtrl控件的

代码。
BOOL CListDlg::OnInitDialog() 
{
CDialog::OnInitDialog();
//简单期间随便附个初值
CString m_strName = _T("my name");
CString m_strFileType = _T("new book");
CString m_strSaveDirectory =_T("trouble");

CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LISTVIEW);

LVITEM lvitem;
lvitem.mask = LVIF_TEXT;
lvitem.iItem = pListCtrl->GetItemCount();
lvitem.iSubItem = 0;
lvitem.pszText = "Name";
//向视图中加入列
pListCtrl->InsertColumn(0,"one",LVCFMT_LEFT,10);
pListCtrl->InsertColumn(1,"two",LVCFMT_LEFT,20);
pListCtrl->InsertColumn(2,"three",LVCFMT_LEFT,30);
pListCtrl->InsertColumn(3,"four",LVCFMT_LEFT,40);

     pListCtrl->SetItem(&lvitem);
//加入项
int i = pListCtrl->InsertItem(0,"NEW");
//加入子项
pListCtrl->SetItemText(i,1,m_strName);
pListCtrl->SetItemText(i,2,m_strFileType);
pListCtrl->SetItemText(i,3,m_strSaveDirectory);

return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}

#9


kkk007(dernier) 你好!
很感谢你的细心
控件这方面,我搞得不是很好,因为我只学了VC半年
但学了太多的东西,所以都不是很精通
能不能我们交个朋友,把你得email给我可以吗?

#10


当一个人的劳动成果能被他人认同时这是最大的回报。很高兴能和你交朋友,不过我也是个新手。dernier_premier@yahoo.com.cn是我的电子邮件,恭候您的回音

#1


没人回答吗?

#2


void CLoginPage::AddLogList(long id, char *name, long loginfo,int n)
{
char ch[32];
sprintf(ch,"%x",id);
    //先插入一个Item再说
int iActualItem = m_list.InsertItem(n,ch);

LVITEM item;

item.iItem = iActualItem;
item.mask = LVIF_TEXT;
item.pszText = ch;
item.cchTextMax=32;
strcpy(item.pszText,name);
item.iSubItem = 1;
//修改它的SubItem的Text值
m_list.SetItem(&item);

    switch(loginfo)
{
case 0:
strcpy(item.pszText,"login");
break;
case 1:
strcpy(item.pszText,"logout");
break;
case 2:
strcpy(item.pszText,"reconnect");
break;
}

item.iSubItem = 2;
//修改它的SubItem的Text值
m_list.SetItem(&item);


}

#3


Setitem和Setitemtext的区别能说一下吗?

#4


SetItem 可修改ITEM的属性
SetItemText只能设定其中的字符

CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_CATEGORY_LISTBOX);
LVITEM lvitem;
lvitem.mask = LVIF_TEXT;
lvitem.iItem = pListCtrl->GetItemCount();
lvitem.iSubItem = 0;
lvitem.pszText = "Name";

??????????pListCtrl->SetItem(&lvitem);
?? 出错!

int i = pListCtrl->InsertItem(&lvitem);
pListCtrl->SetItemText(i,0,m_strName.GetBuffer(64));
pListCtrl->SetItemText(i,1,m_strFileType.GetBuffer(64));
pListCtrl->SetItemText(i,2,m_strSaveDirectory.GetBuffer(64));

您可以使用
for( i = 0 ; i < ?? ; i ++ )
{
   InsertItem(i);
   SetItemText(i,0,"hello");
   SetItemText(i,1,"hello");
}

试试

#5


deng hui er lai kan

#6


一样出错
:(

#7


直接insertitem();来插入每行的头节点,
然后setitemtext设置每一行中子节点,
显示输出的话用不着setitem();你都没有插入节就setitem()当然出错了

#8



说句实话您的错误很怪,以至于当我刚看到你的程序时一时也拿不准您的错误究竟在何处。看了那些好心的朋友给您提的意见和方法后我就更

加迷糊了。最后我只好按照你提供的程序重新编了一个程序才发现错误。首先你没有弄清各控件的功能。系统提供了两种列表控件一个是

CListBox,另一个是CListCtrl。CListBox提供的功能很简单,只能显示某个项的列表,用AddString()就可以向列表框加入字符串。
CListCtrl提供的功能就相对丰富,它能显示图标视图,小图标视图,列表视图和报告试图。从您的程序代码来看,我判断你是想用CListCtrl

控件,但从你调用ID的方式来看(CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_CATEGORY_LISTBOX);),我又觉得你是在用

CListBox控件。如果你真的是在用CListBox控件的话,那就真是错了十万八千里了,因为CListBox根本就无法显示头标和子项这些东西。应该

用CListCtrl控件。如果你本来就是用CListCtl控件的,那我向您道歉。但是您的程序代码仍然有错,您忘了用InsertColumn()加入列了,如果

不用该函数加入列,就根本没法显示项和子项了。CLlistCtrl控件通常显示的是图标视图,如果你想显示子项,必须换成报告视图。简单的方

法是在CListCtrl控件的属性中选Style选项,再将Icon改成Report.下面的程序是我在对话框的OnInitDialog()函数中初始化CListCtrl控件的

代码。
BOOL CListDlg::OnInitDialog() 
{
CDialog::OnInitDialog();
//简单期间随便附个初值
CString m_strName = _T("my name");
CString m_strFileType = _T("new book");
CString m_strSaveDirectory =_T("trouble");

CListCtrl* pListCtrl = (CListCtrl*)GetDlgItem(IDC_LISTVIEW);

LVITEM lvitem;
lvitem.mask = LVIF_TEXT;
lvitem.iItem = pListCtrl->GetItemCount();
lvitem.iSubItem = 0;
lvitem.pszText = "Name";
//向视图中加入列
pListCtrl->InsertColumn(0,"one",LVCFMT_LEFT,10);
pListCtrl->InsertColumn(1,"two",LVCFMT_LEFT,20);
pListCtrl->InsertColumn(2,"three",LVCFMT_LEFT,30);
pListCtrl->InsertColumn(3,"four",LVCFMT_LEFT,40);

     pListCtrl->SetItem(&lvitem);
//加入项
int i = pListCtrl->InsertItem(0,"NEW");
//加入子项
pListCtrl->SetItemText(i,1,m_strName);
pListCtrl->SetItemText(i,2,m_strFileType);
pListCtrl->SetItemText(i,3,m_strSaveDirectory);

return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}

#9


kkk007(dernier) 你好!
很感谢你的细心
控件这方面,我搞得不是很好,因为我只学了VC半年
但学了太多的东西,所以都不是很精通
能不能我们交个朋友,把你得email给我可以吗?

#10


当一个人的劳动成果能被他人认同时这是最大的回报。很高兴能和你交朋友,不过我也是个新手。dernier_premier@yahoo.com.cn是我的电子邮件,恭候您的回音