搜索
查看: 644|回复: 6

listview移除多条索引问题

[复制链接]

25

主题

116

帖子

735

积分

三级会员

Rank: 4

积分
735
发表于 2018-8-3 14:31:26 | 显示全部楼层 |阅读模式
listview 通过 delItem() 移除多条索引问题


问题简述.通过 listview 的 delItem() 方法移除列表当中所选中的2条以上的索引只能清除其中一半  例:选中2条 移除掉1条,选中4条,只移除2条。【选中单条无问题】
         
        <1>选中这几行点击按钮移除所选行 如下图
            1.jpg

        <2>点击按钮移除刚才选中的5,6,7,8,9行,会有几条没有移除成功,感觉是跳着移除的,跳过了第 6 和  8 条,不清楚是否我哪里写的不妥 如下图
            2.jpg
           
可运行代码
  1. import win.ui;
  2. import console;
  3. /*DSG{{*/
  4. var winform = win.form(text="aardio form";right=759;bottom=469)
  5. winform.add(
  6. button={cls="button";text="删除选中的索引项";left=548;top=399;right=693;bottom=440;z=2};
  7. listview={cls="listview";left=49;top=43;right=710;bottom=353;edge=1;fullRow=1;items={};z=1}
  8. )
  9. /*}}*/

  10. winform.listview.setExtended(0x4/*_LVS_EX_CHECKBOXES*/)
  11. winform.listview.insertColumn("id",100);
  12. winform.listview.insertColumn("name",100);
  13. winform.listview.insertColumn("age",150);
  14. winform.listview.onnotify = function(id,code,ptr){

  15.     if( code == 0xFFFFFF9B/*_LVN_ITEMCHANGED*/ ){
  16.         
  17.                  var nmListView = winform.listview.getNotifyMessage(code,ptr);
  18.                 
  19.                  if( !nmListView )
  20.                          return;
  21.                         
  22.                          if( nmListView.uNewState & 0xF000/*_LVIS_STATEIMAGEMASK*/){
  23.                                  var selIndex = nmListView.iItem;
  24.                                 
  25.                                  if( winform.listview.getChecked( selIndex ) ){
  26.                                         
  27.                                          winform.listview.setSelected(selIndex);
  28.                                         
  29.                                  }else {
  30.                                         
  31.                                          winform.listview.setSelected(selIndex,false);
  32.                                         
  33.                                  }
  34.                          }  
  35.          }

  36. }
  37. for(i=1;50;1){
  38.        
  39.         ind = winform.listview.addItem();       
  40.         winform.listview.setItemText(ind,ind,1)
  41.         winform.listview.setItemText("张三"+i,ind,2)
  42.         winform.listview.setItemText("1"+i,ind,3)
  43.        
  44. }

  45. winform.button.oncommand = function(id,event){
  46.    
  47.     var sel = winform.listview.selected;
  48.    
  49.        
  50.         for(i=1;#sel;1){
  51.                        
  52.                 //winform.listview.selIndex = sel[ i ];
  53.                 winform.listview.delItem(sel[ i ]);
  54.                 console.log(sel[ i ])
  55.         }
  56.        
  57. }

  58. winform.show()
  59. win.loopMessage();
复制代码


请教遇到过这个问题的朋友指点。感谢!
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-8-3 14:44:46 | 显示全部楼层
提问有那么多时间截图,
把跟你问题无关的代码删一下不会吗?!大家都很忙。
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls=
"button";text="删除选中的索引项";left=548;top=399;right=693;bottom=440;z=2};
listview={cls=
"listview";left=49;top=43;right=710;bottom=353;edge=1;fullRow=1;items={};z=1}
)
/*}}*/

winform.listview.setExtended(0x4
/*_LVS_EX_CHECKBOXES*/)
winform.listview.insertColumn(
"测试",100);
for(i=1;50)winform.listview.addItem("测试"+i);

winform.button.oncommand =
function(id,event){
   
   
var sel = winform.listview.selected;
   
for(i=1;#sel;1){
        winform.listview.delItem(sel[ i ]);
    }  
}

winform.show()
win.loopMessage();

回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-8-3 14:54:15 | 显示全部楼层
遇到问题以前先低头看一下函数说明不行?!答案都是准备好了的。
写的很清楚:selected指的是选中而不是勾选复选框。

而且你删节点,例如从2删到3,2删完了3就变成2了,
这种基础的逻辑错误可以自己先思考一下。
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-8-3 15:01:50 | 显示全部楼层
1、分清楚checked指的是勾选,selected指的是选中(不一定被勾选)
2、在数组中删成员,要从后面向前删。

正确写法:
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
button={cls=
"button";text="删除选中的索引项";left=548;top=399;right=693;bottom=440;z=2};
listview={cls=
"listview";left=49;top=43;right=710;bottom=353;edge=1;fullRow=1;items={};z=1}
)
/*}}*/

winform.listview.setExtended(0x4
/*_LVS_EX_CHECKBOXES*/)
winform.listview.insertColumn(
"测试",100);
for(i=1;50)winform.listview.addItem("测试"+i);

winform.button.oncommand =
function(id,event){
   
   
var sel = winform.listview.checked;
   
for(i=#sel;1;-1){
        winform.listview.delItem(sel[ i ]);
    }
}

winform.show()
win.loopMessage();



回复

使用道具 举报

25

主题

116

帖子

735

积分

三级会员

Rank: 4

积分
735
 楼主| 发表于 2018-8-3 15:14:51 | 显示全部楼层
Jacen.He 发表于 2018-8-3 15:01
1、分清楚checked指的是勾选,selected指的是选中(不一定被勾选)
2、在数组中删成员,要从后面向前删。
...

感谢  

在上面的代码里我写了     勾选checked的同时做了选中索引的操作

  1. winform.listview.onnotify = function(id,code,ptr){

  2.     if( code == 0xFFFFFF9B/*_LVN_ITEMCHANGED*/ ){
  3.         
  4.                  var nmListView = winform.listview.getNotifyMessage(code,ptr);
  5.                  
  6.                  if( !nmListView )
  7.                          return;
  8.                         
  9.                          if( nmListView.uNewState & 0xF000/*_LVIS_STATEIMAGEMASK*/){
  10.                                  var selIndex = nmListView.iItem;
  11.                                  
  12.                                  if( winform.listview.getChecked( selIndex ) ){
  13.                                          
  14.                                          winform.listview.setSelected(selIndex);
  15.                                          
  16.                                  }else {
  17.                                          
  18.                                          winform.listview.setSelected(selIndex,false);
  19.                                          
  20.                                  }
  21.                          }  
  22.          }

  23. }
复制代码

问题我知道了   删除顺序问题。无论用户怎么选哪怕跳着选  删除的时候也得从后向前删  

回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-8-3 15:28:15 | 显示全部楼层
x876526966 发表于 2018-8-3 15:14
感谢  

在上面的代码里我写了     勾选checked的同时做了选中索引的操作

我没仔细看那段代码,我都是希望大家尽量简化代码,说明关键问题,这样方便我快刀斩乱麻
回复

使用道具 举报

25

主题

116

帖子

735

积分

三级会员

Rank: 4

积分
735
 楼主| 发表于 2018-8-3 15:37:59 | 显示全部楼层
Jacen.He 发表于 2018-8-3 15:01
1、分清楚checked指的是勾选,selected指的是选中(不一定被勾选)
2、在数组中删成员,要从后面向前删。
...

操作了一下,selected 用户操作如果不精准确实不容易选中。受教了! 感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-12-18 23:34 , Processed in 0.078125 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表