1

このリストビュー オブジェクトにまた困惑しました。Windows フォームのリストビューから選択したリストビュー項目を取得しようとすると、コードが「範囲外の添字」エラーを発生させます。VS add watch コマンドを使用すると、次のように表示されます listview オブジェクトのウォッチを見ると、次のように表示されます

this.SearchResults  {System.Windows.Forms.ListView, Items.Count: 52, Items[0]: ListViewItem: {0}}   System.Windows.Forms.ListView

したがって、正しい 52 のカウントが表示され、プログラムの実行中にコレクションから行を選択できます。たとえば、コレクションから 5 番目のアイテムを選択するとします。ウォッチは以下を返します

this.SearchResults.SelectedIndices[0]   5   int

したがって、インデックスを使用して、さらに処理するために listviewitem を別のオブジェクトにのみ渡したいと思います。これを試すと、実行時エラーが発生します

An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in System.Windows.Forms.dll

Additional information: InvalidArgument=Value of '5' is not valid for 'index'.

これはどのように可能ですか?私は52個のアイテムを持っていますが、リストビューが空であるかのようにコードが動作しています。インデックスをハードコーディングしようとしましたが、それもうまくいきませんでした。

このフォームのリストビューのコンストラクターの私のコードは以下のとおりです

public ResultsDisplay(List<MATS_Doc> foundDocs)
    {
        InitializeComponent();

        this.CenterToScreen();
        this.SearchResults.Columns.Add("Title");
        this.SearchResults.Columns.Add("Stuff");
        foreach (MATS_Doc doc in foundDocs)
        {
            // retrieve coresponding document
            // create new ListViewItem
            ListViewItem searchResults = new ListViewItem(doc.Id.ToString());
            searchResults.SubItems.Add(doc.Title);
            searchResults.SubItems.Add(doc.Stuff);
            // add the listviewitem to a new row of the ListView control
            this.SearchResults.Items.Add(searchResults); //show Text1 in column1, Text2 in col2
        }
        foreach (ColumnHeader column in this.SearchResults.Columns)
        {
            column.Width = -2;
        }
        this.Show();
    }

アップデート

以下は、例外がスローされるコードです。リストビューは同じ形式です

 if (scoredListing == null)
        {
            DocumentView showdoc = new DocumentView(this.SearchResults.SelectedItems[this.SearchResults.SelectedIndices[0]]);
            showdoc.ShowDialog();
        }
4

3 に答える 3

3
this.SearchResults.SelectedIndices[0]

SelectedIndicesが空であるため、最初の要素がないため、選択がない場合は毎回スローされます。の値はthis.SearchResults.SelectedIndices.Count? インデックスは 0 からこの値 - 1 の間である必要があります。

編集:OK、MSDNドキュメントでこれを見つけました:

表示されないリストに注意してください

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

EDIT2:これは興味深いが無関係でした。@nolonar が指摘SelectedIndicesしているように、選択されたアイテムではなく、すべてのアイテムを参照するインデックスが含まれているため、値 5 は 5 番目の選択アイテム (おそらく 1 つしかないため) ではなく、全体で 5 番目のアイテムを参照します。

于 2013-04-10T14:38:51.070 に答える
2

使用する必要があるかもしれません

this.SearchResults.Items[4]

5番目のアイテムを選択します。

SelectedItemsリストを使用すると、選択したアイテムのみが返されます。選択したアイテム コレクションの 5 番目のアイテムを呼び出したときに存在しない場合があります。選択がないか、1 つのアイテムしか選択できない可能性があるためです。

于 2013-04-10T14:40:34.600 に答える