怎样删除CListCtrl的第一列? DeleteColumn(0)无效.

hongtog 2005-02-28 05:42:38
需要删除CListCtrl的第一列,,
ClistCtrl里已有数据行,,
使用 DeleteColumn(0),,结果是删除了最后一列,,

而DeleteColumn9(i), i> 0 时是正常的..
...全文
758 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongtog 2005-03-02
  • 打赏
  • 举报
回复
自己解决了. 删除第一列时是这样做的,
先将第一列后面的列全部往前移一列, 包括列头和列项目数据,
再删除最后一列.
不知大家有没有更好的方法, 可以提出一起讨论.

//----------------------------------------------------
// Des: Delete a CListCtrl Column,
// param: nIndex -the column index
// note that you cann't use DeleteColumn(0),
// when you want to delete first column.
//----------------------------------------------------
void DeleteListColumn(CListCtrl *pList, int nIndex)
{
CHeaderCtrl *pHeader = pList->GetHeaderCtrl();
int nHeadCount = pHeader->GetItemCount();
if(nIndex > 0 || nHeadCount == 1) //not first column or not one column
{ //use DeleteColumn(i)
pList->DeleteColumn(nIndex);
return;
}
LV_COLUMN curItem; //column struct
curItem.mask = LVCF_TEXT|LVCF_WIDTH;
char str[64];
int nCx= 0;
memset(str, 0, 64);
curItem.pszText=str;
curItem.cchTextMax=64;
curItem.cx = nCx;

for(int n = 1; n < nHeadCount; n++) //move column 1--n to 0-->n-1
{
pList->GetColumn(n, &curItem); //get next column
pList->SetColumn(n-1, &curItem); //move to previous

for(int i = 0; i < pList->GetItemCount(); i++) //move all items previous
pList->SetItemText(i, n-1, pList->GetItemText(i, n));
}
pList->DeleteColumn(nHeadCount-1); //delete last column
}
hongtog 2005-03-02
  • 打赏
  • 举报
回复
To:legendhui(何离心之可同兮,吾将远逝以自疏)
感谢你的宝贵意见,
确实好不了多少,
但不需要删除CListCtrl列又重新构造列,
也不需根据条件对数据表的重新刷选操作了吧.

To:laiyiling(陌生人++) ( 两星(中级))
还收到你的邮件, 用DeleteColumn(0)可以吗.
legendhui 2005-03-02
  • 打赏
  • 举报
回复
先将第一列后面的列全部往前移一列, 包括列头和列项目数据

你这样作,也不比我全部删除再重新加载强多少啊
legendhui 2005-03-01
  • 打赏
  • 举报
回复
楼上的说的有理,要是你的信息不算多,可以直接全删除,然后重新夹载

我就是这么做的
tipbridge 2005-03-01
  • 打赏
  • 举报
回复
第0列包含很多关于行的信息(如行号,image等),如果仅仅删除第0列,其他的列就没归属了。

皮之不存,毛将焉附?
hongtog 2005-02-28
  • 打赏
  • 举报
回复
OK, Thanks to laiyiling(陌生人++) ( 两星(中级)

3d3x@163.com
Kudeet 2005-02-28
  • 打赏
  • 举报
回复
如果需要留下邮箱,我把DEMO发给你。
Jim_OU 2005-02-28
  • 打赏
  • 举报
回复
多按几次Button1就不只是一列啦...
Kudeet 2005-02-28
  • 打赏
  • 举报
回复
我添加了三列,一行数据,直接就把第一列的所有数据删除了。没问题。
hongtog 2005-02-28
  • 打赏
  • 举报
回复
还有我的CListCtrl是动态生成的..
pList = new CListCtrl;
pList->Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT,
rect, this, ID_LISTCREATE);
hongtog 2005-02-28
  • 打赏
  • 举报
回复
to 楼上,,
你只是加了一列,,当然没问题了..

多列情况下,,只删第一列
Jim_OU 2005-02-28
  • 打赏
  • 举报
回复
void CTestvcDlg::OnButton1()
{
iCount++;
CString CName;
CName.Format("test %d", iCount);
m_list.InsertColumn(0, CName, LVCFMT_LEFT, 100,10);
}

void CTestvcDlg::OnButton2()
{
m_list.DeleteColumn(0);
}

void CTestvcDlg::OnButton3()
{
CString CTemp;
m_list.InsertItem(0,"test");
for(int i=1; i<=iCount; i++)
{
CTemp.Format("test item %d",i);
m_list.SetItemText(0,i,CTemp);
}
}
我尝试过没有问题啊
Kudeet 2005-02-28
  • 打赏
  • 举报
回复
我在一个单独的Dialog base的APP中试过,没有问题的。
hongtog 2005-02-28
  • 打赏
  • 举报
回复
To legendhui:
也是一个办法,但也太勉强了吧..

To laiYinling:
确实无效,你可以试试..
Kudeet 2005-02-28
  • 打赏
  • 举报
回复
应该有效的,估计是其他的代码有什么影响。
legendhui 2005-02-28
  • 打赏
  • 举报
回复
我也碰到过类似问题

不过我是通过把全部的列全删除,再重新向控件写入数据解决的

删除时也要注意:

先DeleteAllItems()

再通过循环

for(i=0;i<3;i++)
{
m_QueryStand.DeleteColumn(0);
}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧