代码之家  ›  专栏  ›  技术社区  ›  Erik Öjebo

为什么在单元测试中实例化ListView时,SelectedIndices和SelectedItems不起作用?

  •  5
  • Erik Öjebo  · 技术社区  · 17 年前

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

    在我目前正在开发的应用程序中,我正在对ListView控件进行子类化,以添加一些功能,其中一些功能与ListView SelectedIndices和SelectedItems属性交互。

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

    item.Selected = true
    

    listView.SelectedIndices.Add(...)
    

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

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

    3 回复  |  直到 17 年前
        1
  •  8
  •   Charlie Charlie    16 年前

    问题似乎是,如果ListView尚未绘制,则SelectedIndices和SelectedItems无法正确更新,正如MSDN文档中的注释所述 ListViewItem.Selected property :

    如果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);
            }
        }
    
        2
  •  7
  •   Erik Öjebo    17 年前

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

    listView。可访问性对象。ToString();//刷新selecteditems属性的解决方法

        3
  •  2
  •   Ben Harris    12 年前

    我发现这叫a。ListView对象上的CreateControl()刷新了SelectedItems属性。

        4
  •  0
  •   Felinis    10 年前