5

我本着回答你自己问题的精神写这个问题,因为我找到了解决问题的方法,但如果有人有更好的解决方案,我很乐意听。

在我当前正在处理的应用程序中,我将 ListView 控件子类化以添加一些功能,其中一些功能与 ListView SelectedIndices 和 SelectedItems 属性交互。

问题是当我尝试对我的子类进行单元测试时,当我将项目添加到选择时,SelectedIndices 和 SelectedItems 属性不会更新。我都试过了

item.Selected = true

listView.SelectedIndices.Add(...)

但是 SelectedIndices 或 SelectedItems 似乎根本没有受到影响。功能其他部分的单元测试工作正常。

如何对我的 ListView 子类的选择相关部分进行单元测试?

4

4 回答 4

8

我发现了一个可以用来填充这些属性的技巧:

listView.AccessibilityObject.ToString(); //解决方法来刷新选定的项目属性

于 2009-02-05T23:07:52.817 回答
7

问题似乎是,如果未绘制 ListView,则 SelectedIndices 和 SelectedItems 无法正确更新,如ListViewItem.Selected 属性的 MSDN 文档中的此评论所述:

如果您的 ListView 从未被绘制过(例如,它在 TabControl 中,在尚未被选中的选项卡中),则 Selected 属性不能被信任。在这种情况下,父 ListView 的 SelectedItems 和 SelectedIndices 未正确更新,仍将为空。

这个问题的一种解决方案是在您的测试中创建一个简单的虚拟表单类,将 ListView 添加到表单并简单地显示表单。之后 SelectedIndices 和 SelectedItems 属性按预期工作。

像这样的东西:

    [Test]
    public void CanGetSelectedItems()
    {
        // simple test to make sure that the SelectedIndices
        // property is updated
        using (var f = new DummyForm(listView))
        {
            f.Show();

            listView.SelectedIndices.Add(0);
            Assert.AreEqual(1, listView.SelectedIndices.Count);
        }
    }

    private class DummyForm : Form
    {
        public DummyForm(ListView listView)
        {
            // Minimize and make it not appear in taskbar to
            // avoid flicker etc when running the tests
            this.WindowState = FormWindowState.Minimized;
            this.ShowInTaskbar = false;
            this.Controls.Add(listView);
        }
    }
于 2008-11-20T10:17:05.177 回答
2

我发现在 ListView 对象上调用 .CreateControl() 会刷新 SelectedItems 属性。

于 2013-03-07T15:53:14.923 回答
0

“我发现在 ListView 对象上调用 .CreateControl() 会刷新 SelectedItems 属性。”

没错,但前提是您也使用多选。

于 2015-07-27T15:21:12.893 回答