void CFireWallApp::SoftInfoToList(CListCtrl &mylist,vector<SoftInfo> &InfoBox)
{
mylist.DeleteAllItems();
vector<SoftInfo>::size_type top=0;
vector<SoftInfo>::size_type bottom=InfoBox.size()-1;

for(vector<SoftInfo>::size_type i=0;i!=InfoBox.size();++i)
{
if(InfoBox[i].Isprotected==TRUE)
{
mylist.InsertItem(top,"");
mylist.SetItemText(top,1,"防溢出保护中");
mylist.SetItemText(top,2,InfoBox[i].displayName);
top++;
}
else
{
mylist.InsertItem(bottom, "");
mylist.SetItemText(bottom,1,"未保护");
mylist.SetItemText(bottom,2,InfoBox[i].displayName);
bottom--;
}
}
}把一个容器内的信息输出到列表控件中,容器内信息有个bool的变量,容器内的信息的bool变量可能为0或者1最后在列表上排列想实现bool为1的全部排在上半部分,bool为0的在下半部分初始化时,容器内所有变量的bool都为0,但是在列表中输出的形式却是隔一行再输出,而且仅输出了容器中所有数量的一半,为什么

解决方案 »

  1.   

    1、你没写出入参InfoBox这个vector是如何给值的。
    2、既然InfoBox只是个入参,用来在函数中给mylist提供信息,所以应该设置为const,如下
       void CFireWallApp::SoftInfoToList(CListCtrl &mylist,const vector <SoftInfo> &InfoBox) 
    3、遍历mylint应使用迭代器,而不是size_type
       vector <SoftInfo>::iterator iter;
       for(iter=InfoBox.begin(); iter!=InfoBox.end(); ++iter){
           int idx = mylist.InsertItem(0, "");
           mylist.SetItemText(idx, 1, "未保护");    //...这行是干嘛用的? ……_……
           mylist.SetItemText(idx, 2, (*iter).displayName); 
       }
      

  2.   

    问题出在InsertItem上
    你可以调试一下下面这条语句:
    int nRetVal = mylist.InsertItem( bottom, "" );
    for循环第一次执行到这时,bottom为3,但是返回行的索引是0.
    说明ListCtrl插入的行号必须是递增的,不可跨越。楼主想实现排序,可以这样:
    先按照InfoBox的size,插入所有行,然后再For循环中SetItemText。
    例如在for循环之前添加如下语句:
    for ( UINT j = 0; j < InfoBox.size(); j++ )
    {
    mylist.InsertItem( j, "" );
    }