如何让listctrl中删除选中行后不留下空白?

时间:2021-10-19 18:01:47
在listctrl中,删除选中一行,然后将listctrl的现有数据全部写入ini文件,在下次打开exe的时候想再插入数据,结果往往在插入数据的上一行多了一行空白行,要怎样才能完全删除行不留空白。
如何让listctrl中删除选中行后不留下空白?
POSITION pos = m_ListCtrl.GetFirstSelectedItemPosition();
while(pos)
{
int nIndex = m_ListCtrl.GetNextSelectedItem(pos);
m_ListCtrl.DeleteItem(nIndex);
pos = m_ListCtrl.GetFirstSelectedItemPosition(); //这步很重要,不然删除不完全
m_ListCtrl.Update(nIndex);
}

20 个解决方案

#1


删除的时候从后面往前删除就不会有这个问题了。

#2


最笨的方法列表控件根据数据刷新一遍

#3


如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

#4


引用 2 楼 zhangyihu321 的回复:
最笨的方法列表控件根据数据刷新一遍
用Updata刷新吗,试过了,不行啊

#5


引用 1 楼 VisualEleven 的回复:
删除的时候从后面往前删除就不会有这个问题了。
如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

#6


引用 5 楼 iegmyxcd 的回复:
Quote: 引用 1 楼 VisualEleven 的回复:

删除的时候从后面往前删除就不会有这个问题了。
如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

得到所选中行的索引(从小到大的顺序),依次从后往前删除即可。

#7


我一般是所有的表项都删了再重插入一遍

#8


引用 6 楼 VisualEleven 的回复:
Quote: 引用 5 楼 iegmyxcd 的回复:

Quote: 引用 1 楼 VisualEleven 的回复:

删除的时候从后面往前删除就不会有这个问题了。
如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

得到所选中行的索引(从小到大的顺序),依次从后往前删除即可。

int  nSelected=m_ListCtrl.GetNextSelectedItem(p); //获取选中行的索引

然后呢,从小到大的顺序是什么意思啊,依次?我只删除那行选中行啊,版主大神求代码啊

#9


引用 7 楼 xianglitian 的回复:
我一般是所有的表项都删了再重插入一遍

但是再重新插入一遍的话怎么知道删除的是哪一行呢,就是说怎么知道不需要再插入哪一行了?
而且我有一个功能就是DeleteAllItem清空全部数据,但是效果跟DeleteItem是一样的,都会留下空白

#10


引用 9 楼 iegmyxcd 的回复:
Quote: 引用 7 楼 xianglitian 的回复:

我一般是所有的表项都删了再重插入一遍

但是再重新插入一遍的话怎么知道删除的是哪一行呢,就是说怎么知道不需要再插入哪一行了?
而且我有一个功能就是DeleteAllItem清空全部数据,但是效果跟DeleteItem是一样的,都会留下空白
数据是独立管理的

#11


引用 8 楼 iegmyxcd 的回复:
Quote: 引用 6 楼 VisualEleven 的回复:

Quote: 引用 5 楼 iegmyxcd 的回复:

Quote: 引用 1 楼 VisualEleven 的回复:

删除的时候从后面往前删除就不会有这个问题了。
如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

得到所选中行的索引(从小到大的顺序),依次从后往前删除即可。

int  nSelected=m_ListCtrl.GetNextSelectedItem(p); //获取选中行的索引

然后呢,从小到大的顺序是什么意思啊,依次?我只删除那行选中行啊,版主大神求代码啊

就是你通过GetFirstSelectedItemPosition、GetNextSelectedItem这些函数获取index索引以后,先不要删除,把这些索引保存一下,比如存入到数组中,然后从后往前遍历数组,取出元素,调用DeleteItem删除之即可。

#12


把nSelect以下的依次通过SetItemText传递给上面的行,然后删除最后一行就可以了!

CString strGet;
for(int i= nSelect;i<m_ListCtrl.GetItemCount()-1;i++)
{
  strGet = m_ListCtrl.GetItemText(i+1,0);
  m_ListCtrl.SetItemText(i,0,strGet);
  .....
}
m_ListCtrl.DeleteItem(m_ListCtrl.GetItemCount()-1);

#13


从后面往前面删除.
伪代码
for(int i=getitemcount()-1;i>=0;--i)
{
     if(getitemstate(i,xxxxxxx)==ITEM_SLECTETED)
        deleteitem(i);
}

#14


我是这么做的,直接从配置文件读出来,删除的时候删除掉指定的行,这行就从配置文件里删除了,我没有再把它们保存一下,感觉没有这个必要吧,下次打开再插入一行,这一行就被插入到配置文件最后一行了啊,没有多出空白行

#15


本帖最后由 VisualEleven 于 2013-10-08 10:07:15 编辑
void TestMessages::OnDel()
{
// TODO: 在此添加命令处理程序代码
CString str;
m_list.GetText(m_list.GetCurSel(),str);
::WritePrivateProfileString(_T("TextMessages"),str,NULL,_T(".\\DataLink.ini"));
int pos=m_list.DeleteString(m_list.GetCount()-1);
m_list.UpdateWindow();
if(m_list.GetCount()>0) 
{this->m_list.SetCurSel(pos-1);}
}

看看这个

#16


选中行以下全删掉,然后把除了选中的那行重新插入

#17


您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法

#18


引用 6 楼 VisualEleven 的回复:
Quote: 引用 5 楼 iegmyxcd 的回复:

Quote: 引用 1 楼 VisualEleven 的回复:

删除的时候从后面往前删除就不会有这个问题了。
如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

得到所选中行的索引(从小到大的顺序),依次从后往前删除即可。


引用 17 楼 xianglitian 的回复:
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法


斑竹们,为什么我不能发帖?
提示【您的帐户被限制发帖,如有疑问请联系版主或论坛管理员。】
但是好歹给个版主或论坛管理员的联系方式吧,邮箱还是发帖,还是怎么联系?
那个【qq316293804】的账号被限制发帖了,所以换个马甲来发帖联系斑竹,希望速速处理~

#19


引用 18 楼 u012248739 的回复:
Quote: 引用 6 楼 VisualEleven 的回复:

Quote: 引用 5 楼 iegmyxcd 的回复:

Quote: 引用 1 楼 VisualEleven 的回复:

删除的时候从后面往前删除就不会有这个问题了。
如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

得到所选中行的索引(从小到大的顺序),依次从后往前删除即可。


引用 17 楼 xianglitian 的回复:
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法


斑竹们,为什么我不能发帖?
提示【您的帐户被限制发帖,如有疑问请联系版主或论坛管理员。】
但是好歹给个版主或论坛管理员的联系方式吧,邮箱还是发帖,还是怎么联系?
那个【qq316293804】的账号被限制发帖了,所以换个马甲来发帖联系斑竹,希望速速处理~

不好意思
你被限制权限不是我操作的
具体情况我也不清楚
您可以去客服专区发帖投诉
http://bbs.****.net/forums/Service
会有人受理的

#20


引用 19 楼 xianglitian 的回复:
Quote: 引用 18 楼 u012248739 的回复:

Quote: 引用 6 楼 VisualEleven 的回复:

Quote: 引用 5 楼 iegmyxcd 的回复:

Quote: 引用 1 楼 VisualEleven 的回复:

删除的时候从后面往前删除就不会有这个问题了。
如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

得到所选中行的索引(从小到大的顺序),依次从后往前删除即可。


引用 17 楼 xianglitian 的回复:
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法


斑竹们,为什么我不能发帖?
提示【您的帐户被限制发帖,如有疑问请联系版主或论坛管理员。】
但是好歹给个版主或论坛管理员的联系方式吧,邮箱还是发帖,还是怎么联系?
那个【qq316293804】的账号被限制发帖了,所以换个马甲来发帖联系斑竹,希望速速处理~

不好意思
你被限制权限不是我操作的
具体情况我也不清楚
您可以去客服专区发帖投诉
http://bbs.****.net/forums/Service
会有人受理的


谢谢,已经解封啦 如何让listctrl中删除选中行后不留下空白?

#1


删除的时候从后面往前删除就不会有这个问题了。

#2


最笨的方法列表控件根据数据刷新一遍

#3


如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

#4


引用 2 楼 zhangyihu321 的回复:
最笨的方法列表控件根据数据刷新一遍
用Updata刷新吗,试过了,不行啊

#5


引用 1 楼 VisualEleven 的回复:
删除的时候从后面往前删除就不会有这个问题了。
如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

#6


引用 5 楼 iegmyxcd 的回复:
Quote: 引用 1 楼 VisualEleven 的回复:

删除的时候从后面往前删除就不会有这个问题了。
如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

得到所选中行的索引(从小到大的顺序),依次从后往前删除即可。

#7


我一般是所有的表项都删了再重插入一遍

#8


引用 6 楼 VisualEleven 的回复:
Quote: 引用 5 楼 iegmyxcd 的回复:

Quote: 引用 1 楼 VisualEleven 的回复:

删除的时候从后面往前删除就不会有这个问题了。
如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

得到所选中行的索引(从小到大的顺序),依次从后往前删除即可。

int  nSelected=m_ListCtrl.GetNextSelectedItem(p); //获取选中行的索引

然后呢,从小到大的顺序是什么意思啊,依次?我只删除那行选中行啊,版主大神求代码啊

#9


引用 7 楼 xianglitian 的回复:
我一般是所有的表项都删了再重插入一遍

但是再重新插入一遍的话怎么知道删除的是哪一行呢,就是说怎么知道不需要再插入哪一行了?
而且我有一个功能就是DeleteAllItem清空全部数据,但是效果跟DeleteItem是一样的,都会留下空白

#10


引用 9 楼 iegmyxcd 的回复:
Quote: 引用 7 楼 xianglitian 的回复:

我一般是所有的表项都删了再重插入一遍

但是再重新插入一遍的话怎么知道删除的是哪一行呢,就是说怎么知道不需要再插入哪一行了?
而且我有一个功能就是DeleteAllItem清空全部数据,但是效果跟DeleteItem是一样的,都会留下空白
数据是独立管理的

#11


引用 8 楼 iegmyxcd 的回复:
Quote: 引用 6 楼 VisualEleven 的回复:

Quote: 引用 5 楼 iegmyxcd 的回复:

Quote: 引用 1 楼 VisualEleven 的回复:

删除的时候从后面往前删除就不会有这个问题了。
如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

得到所选中行的索引(从小到大的顺序),依次从后往前删除即可。

int  nSelected=m_ListCtrl.GetNextSelectedItem(p); //获取选中行的索引

然后呢,从小到大的顺序是什么意思啊,依次?我只删除那行选中行啊,版主大神求代码啊

就是你通过GetFirstSelectedItemPosition、GetNextSelectedItem这些函数获取index索引以后,先不要删除,把这些索引保存一下,比如存入到数组中,然后从后往前遍历数组,取出元素,调用DeleteItem删除之即可。

#12


把nSelect以下的依次通过SetItemText传递给上面的行,然后删除最后一行就可以了!

CString strGet;
for(int i= nSelect;i<m_ListCtrl.GetItemCount()-1;i++)
{
  strGet = m_ListCtrl.GetItemText(i+1,0);
  m_ListCtrl.SetItemText(i,0,strGet);
  .....
}
m_ListCtrl.DeleteItem(m_ListCtrl.GetItemCount()-1);

#13


从后面往前面删除.
伪代码
for(int i=getitemcount()-1;i>=0;--i)
{
     if(getitemstate(i,xxxxxxx)==ITEM_SLECTETED)
        deleteitem(i);
}

#14


我是这么做的,直接从配置文件读出来,删除的时候删除掉指定的行,这行就从配置文件里删除了,我没有再把它们保存一下,感觉没有这个必要吧,下次打开再插入一行,这一行就被插入到配置文件最后一行了啊,没有多出空白行

#15


本帖最后由 VisualEleven 于 2013-10-08 10:07:15 编辑
void TestMessages::OnDel()
{
// TODO: 在此添加命令处理程序代码
CString str;
m_list.GetText(m_list.GetCurSel(),str);
::WritePrivateProfileString(_T("TextMessages"),str,NULL,_T(".\\DataLink.ini"));
int pos=m_list.DeleteString(m_list.GetCount()-1);
m_list.UpdateWindow();
if(m_list.GetCount()>0) 
{this->m_list.SetCurSel(pos-1);}
}

看看这个

#16


选中行以下全删掉,然后把除了选中的那行重新插入

#17


您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法

#18


引用 6 楼 VisualEleven 的回复:
Quote: 引用 5 楼 iegmyxcd 的回复:

Quote: 引用 1 楼 VisualEleven 的回复:

删除的时候从后面往前删除就不会有这个问题了。
如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

得到所选中行的索引(从小到大的顺序),依次从后往前删除即可。


引用 17 楼 xianglitian 的回复:
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法


斑竹们,为什么我不能发帖?
提示【您的帐户被限制发帖,如有疑问请联系版主或论坛管理员。】
但是好歹给个版主或论坛管理员的联系方式吧,邮箱还是发帖,还是怎么联系?
那个【qq316293804】的账号被限制发帖了,所以换个马甲来发帖联系斑竹,希望速速处理~

#19


引用 18 楼 u012248739 的回复:
Quote: 引用 6 楼 VisualEleven 的回复:

Quote: 引用 5 楼 iegmyxcd 的回复:

Quote: 引用 1 楼 VisualEleven 的回复:

删除的时候从后面往前删除就不会有这个问题了。
如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

得到所选中行的索引(从小到大的顺序),依次从后往前删除即可。


引用 17 楼 xianglitian 的回复:
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法


斑竹们,为什么我不能发帖?
提示【您的帐户被限制发帖,如有疑问请联系版主或论坛管理员。】
但是好歹给个版主或论坛管理员的联系方式吧,邮箱还是发帖,还是怎么联系?
那个【qq316293804】的账号被限制发帖了,所以换个马甲来发帖联系斑竹,希望速速处理~

不好意思
你被限制权限不是我操作的
具体情况我也不清楚
您可以去客服专区发帖投诉
http://bbs.****.net/forums/Service
会有人受理的

#20


引用 19 楼 xianglitian 的回复:
Quote: 引用 18 楼 u012248739 的回复:

Quote: 引用 6 楼 VisualEleven 的回复:

Quote: 引用 5 楼 iegmyxcd 的回复:

Quote: 引用 1 楼 VisualEleven 的回复:

删除的时候从后面往前删除就不会有这个问题了。
如何从后面往前删啊,我只是删除选中行啊,是要一个for循环?

得到所选中行的索引(从小到大的顺序),依次从后往前删除即可。


引用 17 楼 xianglitian 的回复:
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法


斑竹们,为什么我不能发帖?
提示【您的帐户被限制发帖,如有疑问请联系版主或论坛管理员。】
但是好歹给个版主或论坛管理员的联系方式吧,邮箱还是发帖,还是怎么联系?
那个【qq316293804】的账号被限制发帖了,所以换个马甲来发帖联系斑竹,希望速速处理~

不好意思
你被限制权限不是我操作的
具体情况我也不清楚
您可以去客服专区发帖投诉
http://bbs.****.net/forums/Service
会有人受理的


谢谢,已经解封啦 如何让listctrl中删除选中行后不留下空白?

#21