您的位置:程序门 -> vc/mfc -> 界面



clistctrl控件多次删除行和列及标题为何出错!!!???


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


clistctrl控件多次删除行和列及标题为何出错!!!???[已结贴,结贴人:yvyx_tju]
发表于:2007-10-24 10:55:46 楼主
对clistctrl控件需要多次改变标题和控件里边的数据,然而执行3次以后,系统给出某内存不能为读的错误。不知什么原因,请大家帮忙!


删除部分代码如下:

int   i   =   0,   icount;
m_list.deleteallitems();   //   首先清空listview

icount   =   m_list.getheaderctrl()-> getitemcount();

for(i   =   0;   i   <   icount;   i++)
{
m_list.deletecolumn(0);
}

for(i   =   0;   i   <   icount;   i++)
{
m_list.getheaderctrl()-> deleteitem(0);
}

发表于:2007-10-24 10:58:241楼 得分:0
yvyx_tju
发表于:2007-10-24 11:36:372楼 得分:30
是不是重复删除了?deletecolumn(),deleteitem()删除的都是同样的东西
发表于:2007-10-24 11:55:093楼 得分:10
1)m_list.deletecolumn(0);   这个已经删除了,再删除能不出错吗?
2)如果lz想删除所有,建议从大到小删除。
发表于:2007-10-24 13:01:564楼 得分:0
谢谢大家的热心,我的实际情况是:填充了数据后,下次再显示时(没有退出该程序),需要将这些数据清空(包括标题)因为下次显示的数据是新的内容,包括标题的内容都是新的。有人给我出了个主意:要我动态生成控件,即每次都生成新的控件,我不知道行不行。
发表于:2007-10-24 13:08:595楼 得分:0
楼主把initlist()写成单独的函数,initlist()中用clistctrl   &lc   =   getlistctrl();while(lc.deletecolumn(0))来删除列表头,用lc.deleteallitems()删除列表中的数据;这样每次需要重新显示的时候,就调用不同的initlist()
发表于:2007-10-24 13:22:486楼 得分:0
试问codejockey   ,象我这种情况,是删除的方式不对,还是微软的控件有bug?
我的这段代码也是在网上找到的:
int   i   =   0,   icount;  
m_list.deleteallitems();   //   首先清空listview  

icount   =   m_list.getheaderctrl()-   > getitemcount();  

for(i   =   0;   i     <   icount;   i++)  
{  
m_list.deletecolumn(0);  
}  

for(i   =   0;   i     <   icount;   i++)  
{  
m_list.getheaderctrl()-   > deleteitem(0);  
}  

发表于:2007-10-24 14:25:037楼 得分:10
你重复删除了内容
发表于:2007-10-24 14:43:328楼 得分:0
上面已经说了,你重复删除了,两个循环只要一个就可以了,还有,如果下次显示则需要重新初始化列表头。
给你一个函数看看:
void   testlistview::initlist()
{
clistctrl   &lc   =   getlistctrl();
dword   i   =   0;
cheaderctrl*   pheader   =   lc.getheaderctrl();
int   ncolumncount   =   pheader-> getitemcount();
for   (i   =   0;i   <   ncolumncount;i++)
{
lc.deletecolumn(0);//删除列表头
}
lc.setextendedstyle(lvs_alignleft   ¦lvs_ex_headerdragdrop   ¦lvs_ex_gridlines   ¦lvs_ex_fullrowselect   ¦lvs_ex_checkboxes   ¦lvs_ex_trackselect);

lc.sethovertime(0);//设置鼠标停顿选择时间间隔

dword   count=sizeof(_nfieldname)/sizeof(int);
cstring   strfieldname;

for(i=0;i <count;i++)
{
strfieldname.loadstring   (_nfieldname[i]);
lc.insertcolumn(i,strfieldname,lvcfmt_left,_ncolwidth[i]);//初始化列表头
}

}


static   int   _nfieldname[]={
                        ids_col_serial,//序号(在string   table中定义的列表头)
                                              idc_col_name,//名字
};

static   int   _ncolwidth[]={
        60,
                        100,
};
发表于:2007-10-26 12:37:159楼 得分:0
问题已经解决了,下面的语句:
int   i   =   0,   icount;  
m_list.deleteallitems();   //   首先清空listview  

icount   =   m_list.getheaderctrl()-   > getitemcount();  

for(i   =   0;   i     <   icount;   i++)  
{  
m_list.deletecolumn(0);  
}  

for(i   =   0;   i     <   icount;   i++)  
{  
m_list.getheaderctrl()-   > deleteitem(0);  
}  

没有什么问题。我的程序是在其它的地方使用了不恰当的语句,影响了上述语句的。


快速检索

最新资讯
热门点击