.NET:ListView蓝调?

时间:2009-02-11 02:01:49

标签: c# .net vb.net winforms listview

选择计数.SelectedItems.Count在何时不会改变 对Selected中的项目Items属性设置为true 收集ListView

示例:

  lvPept.SelectedItems.Clear()
  lvPept.Items(6).Selected = True
  Dim newLen As Integer = lvPept.SelectedItems.Count

lvPeptListView,包含10个元素。

newLen预计为1,但问题发生时为0 并且SelectedIndexChanged事件是 被解雇。同 其他数据集如预期的那样是1和 SelectedIndexChanged事件被触发。

lvPept可以处于什么样的情况或状态 为了这个发生? BeginUpdate()/ EndUpdate() lvPept一起使用。

背景:

我正在尝试追踪我的一个用户的问题 开源.NET应用程序,MSQuant 遇到了(http://msquant.sourceforge.net/)。

我已经不知道可能是什么原因 问题

这个问题是可以重现的,我可以在我的网站上重现它 开发环境,Visual Studio 2008.似乎是 独立于Windows版本(Windows 2000 / Windows XP 32位/ Windows XP 64位),.NET运行时版本(2.0 / 3.5)和Visual Studio版(2005/2008)。

其他上下文:应用程序是用VB.NET编写的 C#并且是Windows窗体应用程序。的源代码 有问题的课程是http://shrinkster.com/14bg。该 最初生成ListView所在的表单类 通过最早的Visual Studio官方版本之一 支持.NET,ca。 2002。

更新1:因为我有工作案例和破案案我 比较了lvPept的内容。唯一的区别 属性“Handle”,“MousePosition”和“TopItem”除外 (因为它是具有不同肽的不同蛋白质)是属性 “创建”。破碎的案子是假的。这说得通 部分构造的对象无法正常运行, 但它怎么会发生呢?

更新2:属性“已创建”为假,结果为a 良好的领导。我认为真正的问题是这样做 构建时间而不是表单加载时间。我现在有了 为“已创建”,重构和更改的属性添加了ASSERT 在表单加载时发生的所有操作。它现在有效 正如预期的那样,有问题的用户得到了新的 应用程序的版本。

自应用程序以来,旧的糟糕方式就在那里 在2002年成立。我只是想知道是否有专家可以 重点介绍为什么它99.9%的时间只能工作 在少数情况下失败并且可重复。

2 个答案:

答案 0 :(得分:1)

这是一个有趣的。

我认为唯一能让这种情况发生的事情是ListView没有意识到ListItem已经改变了它的“Selected”值,因此不会更新它所选择的项目集合。

每次获取属性时都不一定会生成.SelectedItems属性 - 如果您反映System.Windows.Forms程序集:

    if (this.selectedListViewItemCollection == null)
    {
        this.selectedListViewItemCollection = new SelectedListViewItemCollection(this);
    }
    return this.selectedListViewItemCollection;

所以我倾向于认为你得到了一个过时的selectListViewItemCollection。

我会尝试而不是在Item级别更改Selected属性,而是尝试将所选索引添加到ListView的.SelectedIndices属性中,看看是否有效。这样,ListView不依赖于拾取ListViewItem更改。

答案 1 :(得分:0)

我相信您还必须调用ListView.Select()才能触发SelectedIndexChanged事件。

lvPept.SelectedItems.Clear()
lvPept.Items(6).Selected = True
lvPept.Select()
Dim newLen As Integer = lvPept.SelectedItems.Count