2016-12-07 1 views
0

이미지 크기를 조정하기위한 WinForms 프로그램을 C#으로 작성했습니다.이미지 ListView에서 선택한 항목의 인덱스를 가져 오는 방법은 무엇입니까?

나는 ListView를 가지고있다. 이 ListView의 항목은 ImageList의 이미지입니다.

ImageList 및 ListView는 사용자가 이미지를 끌어 양식에 놓을 때 채워집니다.

또한 ImageList 및 ListView와 동시에 채워지는 imageFilePaths [] 및 imageFileNames [] (두 가지 문자열 배열)를 만들었습니다. 이러한 개체의 네 가지로

은 의해, dragDrop 방법의 반복을 통해 채워, 그렇게하는 의 ImageList, ListView를, imageFilePaths []imageFileNames [] 완벽 일치하는 최대의 인덱스.

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 초가 걸려 모든 필드가 강조 표시됩니다. '선택 항목 제거'버튼이 있기 때문에 이것은 나에게 중요합니다. 항목을 '선택 취소'하는 데 오랜 시간이 걸립니다.

이 이벤트 리스너가 모든 단일 항목을 반복하므로 꼭 필요한 항목이 아니더라도 마지막 항목에 도달 할 때까지 각 선택된 항목의 크기와 파일 이름이 표시되므로 이것이 95 %라는 것을 확신합니다.

선택한 항목 만 색인을 가져올 수 있도록 여러 항목을 선택하거나 여러 항목을 선택한 경우 색인의 마지막 색인을 다시 작성할 수 있습니까?

감사

편집 : 의견을 바탕으로, 나는 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 
} 

어디 색인 및 값 항목입니다

+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 차원 배열을 만들어 느린있는 이미지를 선택하는 대신지고의 문제를 해결 대답은 선택된 이미지 경로에서 이미지를 가져올 때 이미지가 폼에 떨어질 때 초기화되는 배열에서 가져옵니다.

관련 문제