2010-07-12 4 views
8

C#에서 ListView 컨트롤을 사용하는 Winforms App이 있습니다. 이 ListView는 TO-DO 항목의 목록을 표시하며 'ItemSelectionChanged'이벤트를 사용하여 업데이트를 처리합니다.Listview ItemSelectionChanged가 두 번 발생합니까?

문제는 'ItemSelectionChanged'이벤트가 업데이트를 시도 할 때마다 두 번 발생한다는 것입니다.

ItemSelectionChanged 이벤트는 양식을 새로 고쳐 업데이트를 나타냅니다 (즉, 목록에서 항목 제거).

새로 고침 후 이벤트 실행을 중지 할 수있는 방법이 있습니까?

갱신 1 :

private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) 
    { 
     if (e.IsSelected) 
     {     
      listView1.Items[e.ItemIndex].Remove(); 

      listView1.SelectedIndices.Clear(); 
      listView1.Focus(); 

      listView1.Update(); 
     } 
     else 
     { 

     } 

    } 

답변

10

예 새로 고침 완료된 후 다시 추가, 그것은 두 번 발사됩니다. 이전에 선택한 항목이 선택 취소 되었기 때문에 한 번. 새로 선택한 항목에 대해 다시 한 번 선택 이벤트가 표시되는지 확인해야합니다.

private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) { 
     if (e.IsSelected) { 
      // Update form 
      //... 
     } 
    } 
+0

감사하지만 IsSelected가 작동하지 않았습니다. 코드를 두 번 계속 실행하는 코드가 있어야합니다. –

+0

아니요, 확실히 두 번 발사됩니다. 이는 의도적으로 설계된 동작입니다. 요점은 관심있는 것을 탐지하는 것입니다. 귀하의 질문에서 명확하지 않습니다. –

1

예 바로 재생 시작시의 이벤트 핸들러를 제거하고이

// Remove handler 
listView1.ItemSelectionChanged -= new ListViewItemSelectionChangedEventHandler(listView1_ItemSelectionChanged); 

// Do refresh 

// Add again 
listView1.ItemSelectionChanged += new ListViewItemSelectionChangedEventHandler(listView1_ItemSelectionChanged); 
+0

'OnSelectionChanged'에 대한 추가 참조가 필요합니까? –

+1

아니요, ListView를 ListViewControl 즉 ListView1의 이름으로 대체해야하며 MethodName은 OnSelectionChanged 이벤트가 발생했을 때 호출되는 함수의 이름이어야합니다. 예를 들어 ListView1은 ListViewControl의 이름입니다. – w69rdy

+0

나를 위해 'OnSelectionChanged'는 Intellisense에 표시되지 않습니다. –

0

처리기가 끝날 때 수동으로 항목을 선택 취소해야한다고 생각합니다.

listView1.SelectedItem = null;

관련 문제