ListView中的焦点

来源:互联网 发布:android tool for mac 编辑:程序博客网 时间:2024/06/05 00:40

      今天碰到一个令人匪夷所思的问题,ListView中通过ImageList显示图片,在SelectedIndexChanged事件响应函数中,鼠标选中一个图片可以在另一个Text控件中显示该图片的信息。代码如下:

      若用注释中的代码获取selectedIndex,则当ListView控件刷新后,通过虚线框选择任意一个或多个图片都会导致异常,跟踪后发现selectedIndex值为-1,而item值为null。但是若是鼠标直接单击选中一个图片,则不会出现这种异常。(IndexOf(Item)函数当参数不在ListView中时,放回-1)。

       MSDN上对FocusedItem的说明如下:

       表示具有焦点的项的 ListViewItem;如果 ListView 中的所有项都不具有焦点,则为 null。Nothingnullptrnull 引用(在 Visual Basic 中为 Nothing

       FocusedItem 属性返回 ListViewItem,它表示当前为 ListView 控件显示聚焦框的项。由于 ListView 控件没有可直接编辑的区域(它显示的项除外),所以当 ListView 控件具有焦点时,ListView 中的项会在其项文本周围显示焦点标

线。通常,在 ListView 控件中最后选择的项是具有焦点的项。虽然某一项可能是显示焦点标线的项,但实际上它可能不是 ListView 中的选定项。使用 SelectedItemsSelectedIndices 属性来获取 ListView 控件中的选定项,不必选择 FocusedItem 属性。您可以使用 FocusedItem 属性来确定 ListView 控件中最后单击的项,不考虑选择状态。

 

      以上说明可以知道,item之所以为null,是因为ListView中没有项获得焦点。但是如果不通过刷新(就是先把ListView和ImageList调用clear()函数再重新绘制),而是在鼠标随意单击之后,再通过虚线框选择某一项,则不会出现如上的异常。为什么?(以上注释后的代码可以运行正确)

 

 ----------------------------------------------------------------------------------------------------------------------------------------------------

      以上问题通过后来的进一步调试,发现若用虚线框来选择ListView中的Item,则不管“框住”哪个项目,FocusedItem都是最后一次鼠标单击选中或通过方向键选中并按下enter键确认的项目,而不是虚线框中的任何一个项。即通过虚线框选择和通过方向键选择而不按下enter键确认,是不能改变焦点的,这就是“焦点”在获得焦点的控件中与“选中”的区别。刷新以后,控件中的任何一个项目都不具有焦点,故而通过FocusedItem返回的项目为null。以前没有找到原因,是因为我把所有的项目的关键字都默认设置为相同,这次把每个项目的关键字改为不同后,才看清楚。

     如图所示,鼠标选中第四张图片,关键字区却显示的是第二张图片的。这是因为第二张才是获得焦点的项目。

原创粉丝点击