搜索
查看: 1131|回复: 6

在listview空白处点击之后,selIndex仍会返回上次选中项的索引

[复制链接]

7

主题

14

帖子

99

积分

一级会员

Rank: 2

积分
99
发表于 2018-4-18 13:24:52 | 显示全部楼层 |阅读模式
  1. import win.ui;
  2. /*DSG{{*/
  3. mainForm = win.form(text="aardio form";right=332;bottom=303)
  4. mainForm.add(
  5. button={cls="button";text="button";left=75;top=248;right=171;bottom=282;z=2};
  6. listview={cls="listview";left=17;top=12;right=305;bottom=216;edge=1;fullRow=1;gridLines=1;msel=false;z=1}
  7. )
  8. /*}}*/

  9. mainForm.enableDpiScaling();
  10. mainForm.show();

  11. list = mainForm.listview;
  12. list.insertColumn("col1",120);
  13. list.insertColumn("col2",120);
  14. list.addItem({"row11";"row12"});
  15. list.addItem({"row21";"row22"});

  16. mainForm.button.oncommand = function(id,event){
  17.         var i =  list.selIndex;
  18.         mainForm.msgbox(i)
  19. }

  20. return win.loopMessage();
复制代码


程序运行后,listview没有选中项,此时,listview.selIndex的值0。如果在listview中先选中一项,然后再在listview的空白处点击一下。此时,listview上已经没有选中项了,但此时listview.selIndex的值却是上一次选中项的索引。

我有点疑问,为什么值不是0啊?
回复

使用道具 举报

0

主题

25

帖子

171

积分

一级会员

Rank: 2

积分
171
发表于 2018-4-18 14:21:17 | 显示全部楼层
看下代码,似乎selIndex是为了取“当前”选中的,所以用了最后焦点的行。而selected里面取出的是所有的选中的行的序号数组。selected里面的就是正常的。所以如果是单先的话可以通过list.selected[1]这样来取。如果是null就没有选中就是null . 然后由Jacen.He判断需不需要改selIndex的表现。
回复

使用道具 举报

186

主题

2537

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13936
发表于 2018-4-18 14:48:40 | 显示全部楼层
vikon 发表于 2018-4-18 14:21 ...然后由Jacen.He判断需不需要改selIndex的表现
selIndex 跟 selected 当然不一样。
selIndex  永远只有一个, selected 有多个。

反馈建议提交到【意见反馈】
回复

使用道具 举报

186

主题

2537

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13936
发表于 2018-4-18 14:51:17 | 显示全部楼层
chearv发表于 2018-4-18
...我有点疑问,为什么值不是0啊?
这你可能要去问微软了,为什么你都点空白了,当前项还会是2,这个东西不是我规定的。
回复

使用道具 举报

4

主题

63

帖子

460

积分

二级会员

Rank: 3Rank: 3

积分
460
发表于 2018-4-18 15:43:36 | 显示全部楼层
vikon 发表于 2018-4-18 14:21
看下代码,似乎selIndex是为了取“当前”选中的,所以用了最后焦点的行。而selected里面取出的是所有的选中 ...

我看了一遍源码,也查了一遍微软的MSDN,根据你的要求,发现如果你想实现你的效果的话,可以
修改标准库listview.aardiode的656行处为

  1.                                 return ::SendMessageInt(owner.hwnd, 0x100C/*_LVM_GETNEXTITEM*/, -1,0x2/*_LVNI_SELECTED*/) + 1
复制代码


这个修改可以通过复制标准库为用户库来进行,避免产生不良反应。因为我没有做普遍性测试,只能保证实现效果,如果有其他问题,请使用未被修改的原始标准库。
回复

使用道具 举报

4

主题

63

帖子

460

积分

二级会员

Rank: 3Rank: 3

积分
460
发表于 2018-4-18 16:46:06 | 显示全部楼层
如果你需要获取选中项的索引(单选模式下),可以使用
mainForm.listview.getSelection();
来获取,selIndex属性默认返回的是上次焦点所在的选项的索引,虽然点击空白会使选项变为未选取样式,但焦点不会因为点击空白而失去,这个在aardio里不显示,如果你使用C#来进行同样的测试,就能看见标明焦点所在位置的虚线框。当然selIndex也是很有用的,比如,你可以获取在多选模式下,最后一次点击的选项的索引。
回复

使用道具 举报

7

主题

14

帖子

99

积分

一级会员

Rank: 2

积分
99
 楼主| 发表于 2018-4-18 22:14:38 | 显示全部楼层
我心飞翔1995 发表于 2018-4-18 16:46
如果你需要获取选中项的索引(单选模式下),可以使用
mainForm.listview.getSelection();
来获取,selI ...

哦,我以为selIndex 是 selected Index的意思。现在弄我明白了。将listview设定为禁止多选,然后selected[1]和getSelection()都符合我的要求。谢谢了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2018-8-19 23:52 , Processed in 0.062500 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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