5

問題の解決策を見つけたので、私はあなた自身の質問に答えるという精神でこの質問を書いていますが、誰かがより良い解決策を持っているなら、私は喜んでそれを聞きます.

私が現在取り組んでいるアプリケーションでは、ListView コントロールをサブクラス化して、ListView の SelectedIndices および SelectedItems プロパティとやり取りする機能を追加しています。

問題は、サブクラスを単体テストしようとすると、項目を選択項目に追加しても SelectedIndices および SelectedItems プロパティが更新されないことです。両方試してみました

item.Selected = true

listView.SelectedIndices.Add(...)

ただし、SelectedIndices または SelectedItems は影響を受けていないようです。機能の他の部分の単体テストは正常に機能します。

ListView サブクラスの選択に依存する部分を単体テストするにはどうすればよいですか?

4

4 に答える 4

8

これらのプロパティを設定するために使用できるトリックを見つけました。

listView.AccessibilityObject.ToString(); //selecteditems のプロパティを更新するための回避策

于 2009-02-05T23:07:52.817 に答える
7

ListViewItem.Selected プロパティの MSDN ドキュメントのこのコメントに記載されているように、ListView が描画されていない場合、SelectedIndices と SelectedItems が正しく更新されないことが問題のようです。

ListView が一度も描画されていない場合 (たとえば、TabControl 内にあり、まだ選択されていないタブ内にある場合)、Selected プロパティは信頼できません。その場合、親 ListView の SelectedItems と SelectedIndices は正しく更新されず、空のままになります。

この問題の 1 つの解決策は、テストで単純なダミー フォーム クラスを作成し、フォームに 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 に答える