2016-12-07 6 views
0

イメージのサイズを変更するためのWinFormsプログラムを、C#で作成しています。画像ListViewで選択した項目のインデックスを取得するにはどうすればよいですか?

私はListViewを持っています。このListViewの項目はImageListの画像です。

ImageListとListViewは、ユーザーが画像をドラッグしてフォームにドロップすると設定されます。

ImageListとListViewと同時に読み込まれる2つの文字列配列imageFilePaths []とimageFileNames [](これはかなりわかりやすい)も作成しました。

これらのオブジェクトのすべての4つは、イメージリスト、完全リストビューimageFilePaths []imageFileNames []マッチアップのインデックスので、dragDropの各方法で反復を通して移入された通りです。

私はListViewのイベントリスナーを持っています。 ListView内の項目をクリックすると、前述の配列からListView.SelectedItemsインデックスと一致するインデックス位置にファイル名とファイルパスが取得されます。コードは次のとおりです。

private void imageListView_SelectedIndexChanged(object sender, EventArgs e)   
    { 
     foreach (ListViewItem item in imageListView.SelectedItems) 
     { 
      int imgIndex = item.ImageIndex; 
      if (imgIndex >= 0 && imgIndex < imageList1.Images.Count) 
      { 
       filenameTb.Text = imageFileNames[imgIndex]; 
       updateDimensions(imageFilePaths[imgIndex]); 
      } 
     } 
    } 

これは機能しますが、私は好きではありません。たとえば、ListViewに20個の画像があり、Shiftキーを押しながら項目をエリア選択しようとすると、すべての項目がハイライト表示されるまでに約10〜20秒かかります。 私は「選択を解除」ボタンがあるので、これは私にとって重要です。アイテムを「選択解除」するのと同じくらい時間がかかります。

これは、このイベントリスナーがすべての単一アイテムをループしているため、選択された各アイテムのサイズとファイル名が最後のものになるまで表示されるためです。

これを書き直して、選択したアイテムのみのインデックスを取得したり、複数のアイテムを選択した場合は、最後のインデックスを取得することができますか?

おかげ

編集:コメントに基づいて、私はSelectedIndicesプロパティを見上げて、これを試してみた:

private void imageListView_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     ListView.SelectedIndexCollection indexes = this.imageListView.SelectedIndices; 
     foreach (int index in indexes) 
     { 
      filenameTb.Text = imageFileNames[index]; 
      updateDimensions(imageFilePaths[index]); 
     } 
    } 

それは...しかしまだ

+0

あなたはインデックスのみを使用しています。私はあなたが常に呼び出し側に完全なアイテムを返さないように使用できる 'ListView'に' SelectedIndices'プロパティがあると信じています。 – TheLethalCoder

+0

[複数選択リストボックスで最後に選択したアイテムを取得する方法]の複製がありますか?(http://stackoverflow.com/questions/305555/how-to-get-the-last-selected-item-in-multiselect-listbox) – TheLethalCoder

+0

ねえ、私が作った編集を見てください –

答えて

0
foreach (ListViewItem item in imageListView.SelectedItems.Select((value, i) => new { i, value }) 
{ 
    //your code 
} 

痛々しいほど遅いですwhereはインデックスでアイテムの値はどこですか

+0

これはどのように質問に答えますか分かりません – TheLethalCoder

0

SelectedIndexChangedイベントを使用する代わりに、t ItemSelectionChangedを使用しています。そのイベントハンドラに渡されたイベントは、関連するアイテムを直接提供します。反復する必要はありません。

 private void imageListView_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) 
    { 
     e.Item ... <- this is your item 
     e.ItemIndex ... <- this is your item's index 
    } 
+0

しかし、e.IsSelectedプロパティを確認してください。このイベントは選択と選択解除の両方で発生するためです。 – dviljoen

0

ていない私はもともと探していたが、私は、画像の大きさ(x、y)を記憶する2次元配列を作成することにより、低速である画像を選択する問題を解決し、正確に回答し、代わりに選択さの寸法を取得しますイメージをイメージパスから取得すると、イメージがフォームにドロップされたときに初期化される配列からそれらを取得しています。

関連する問題