首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

请大家帮忙,ListView1中数据分组到ListView2中,该怎么解决

2012-05-11 
请大家帮忙,ListView1中数据分组到ListView2中ListView1中一共有7列数据。如果某一行(Item)的第2列(Strings

请大家帮忙,ListView1中数据分组到ListView2中
ListView1中一共有7列数据。如果某一行(Item)的第2列(Strings[0])和第7列(Strings[5])中字符串完全和另一行的第2列和第7列完全相同,那么就统计下来,然后找出所有这样同类的,将统计的结果放在ListView2中。下面两个图是效果,但是我的代码写出来,循环的过程中会重复统计:譬如第1行和第2行是同类(即它们的第2列和第7列完全一样),外循环固定在第1行时,内循环从第2行往下一直遍历整表,找出若干个和第1行同类的;然后外循环固定在第2行,内循环从第3行再开始往下遍历整表,又找出和第2行同类的若干个数据,但是第1行本来和第2行就同类,这样相当于统计了两遍,如此下去,和第1行同类的越靠上的数据则会被多次统计,如何解决这个问题呢?不知道我说明白没。大家帮忙看看如何解决,非常感谢
下面是我的程序代码:

C/C++ code
int count = 0; //用于元件个数计数AnsiString package, comment; //元件封装和元件备注中间变量for(int i = 0; i < ListView1 -> Items -> Count; i++)    {    for(int j = i; j < ListView1 -> Items -> Count; j++)        {        if(ListView1 -> Items -> Item[i] -> SubItems -> Strings[0] == ListView1 -> Items -> Item[j] -> SubItems -> Strings[0] &&             ListView1 -> Items -> Item[i] -> SubItems -> Strings[5] == ListView1 -> Items -> Item[j] -> SubItems -> Strings[5])            {            ++count;            package = ListView1 -> Items -> Item[i] -> SubItems -> Strings[0]; //封装类型所在列            comment = ListView1 -> Items -> Item[i] -> SubItems -> Strings[5]; //元件备注所在列            }        }    TListItem *csvgroup = ListView2 -> Items -> Add();    csvgroup -> Caption = package;    csvgroup -> SubItems -> Add(comment);    csvgroup -> SubItems -> Add(IntToStr(count));    }

图1和图2是我程序中的界面截图。

图1:红色框中为同类条件所在列

图2:ListView2中要显示的界面


图3是别的网友程序的截图,也就是我想在ListView2中想要的效果,不过网友的截图中没有统计“同类个数”这一列。


[解决办法]
你把统计好的数据的删除掉不就得了?

第一行开始循环,查到相同的,就加入listview2,删除查到的这个行数
然后循环到结束,就删除第一行。

这样运行起来,元素越来越少,循环也越来越快
也不会有重复啊。
[解决办法]
友情支持一下, 看楼主搞了好几天了, 希望顺利搞定
[解决办法]
那就建个数组,条数跟listview的元素一样多,
每次取出一个值,就做下相应标识。
每次取值前判断数组中的标识,如果表示该条记录已经读取,就跳过。
[解决办法]
大家好,zwz1015和qq8586999是同一号,都是我。
我采取下面的方法处理这个问题:
一个按钮解决两步操作↓
1.先将LisView1中第2列Strings[0]和第7列Strings[5]全部载入到ListView2中的第1列(Caption列)和第2列Strings[0]中去;
2.然后在ListView2中采取循环查询,删除同类并计数的办法。
下面是效果图:

不过这里面有两个bug还没有解决:
1.从上面的图中可以看出我画红框内的有些同类Item没有完全删除完,如何才能删完?
2.统计完同类的元件个数后,我想把count写入到ListView2的第3列(Strings[1])中,但是我一旦添加这一列(就是下面代码中黑体部分),就会提示越界(list index out of bounds(1)),这是什么原因啊?
下面是我的代码:
C/C++ code
for(int i = 0; i < ListView1 -> Items -> Count; i++) //先把List1中封装列和备注列全部写入List2中    {    TListItem *csvgroup = ListView2 -> Items -> Add();    csvgroup -> Caption = ListView1 -> Items -> Item[i] -> SubItems -> Strings[0]; //封装列    csvgroup -> SubItems -> Add(ListView1 -> Items -> Item[i] -> SubItems -> Strings[5]); //备注列    }int count; //用于元件个数计数for(int j = 0; j < ListView2 -> Items -> Count; j++) //在List2中进行同类删除和计数    {    for(int k = j + 1; k < ListView2 -> Items -> Count; k++)        {        if(ListView2 -> Items -> Item[k] -> Caption == ListView2 -> Items -> Item[j] -> Caption &&             ListView2 -> Items -> Item[k] -> SubItems -> Strings[0] == ListView2 -> Items -> Item[j] -> SubItems -> Strings[0])             ListView2 -> Items -> Item[k] -> Delete();             count++;        }//    [b]ListView2 -> Items -> Item[j] -> SubItems -> Strings[1] = IntToStr(count); //个数写入到List2中的第3列,即Strings[1][/b]    count = 1; //每一次外循环count计数都重新从1开始    } 

热点排行