2009-03-31 9 views
0

winform ListView는 SelectedIndexChanged 이벤트를 취소하는 쉬운 방법이없는 것 같습니다. SelectedIndexChanging 이벤트가 표시되지 않습니다.WinForm ListView에서 SelectedIndexChanged 취소하기

코드는 제 시도입니다. 그러나 hightlight가 사라졌고 나는 또한 선택을 색칠해야하는지 아니면 취소 할 더 좋은 방법이 있는지 궁금 해서요. _prevSelectedIndex는 마지막 선택 항목의 인덱스입니다. 하이라이트를 이전 선택으로 되돌리려합니다.

lvSearchResults.SelectedIndexChanged -= new EventHandler(lvSearchResults_SelectedIndexChanged); 
lvSearchResults.SelectedIndices.Clear(); 
lvSearchResults.SelectedIndices.Add(_prevSelectedIndex); 
lvSearchResults.Items[_prevSelectedIndex].Selected = true; 
lvSearchResults.SelectedIndexChanged += new EventHandler(lvSearchResults_SelectedIndexChanged); 

답변

0

는만큼 당신이 가지고있는 다중 선택은 당신이 SelectedIndices.Clear() Selectedndices.Add (..)뿐만 아니라 항목을 호출 할 필요가 없습니다 꺼져 [_prevSelectedIndex] .Selected = TRUE; - 후자는 같은 결과를 얻을 것입니다.

계속해서 이벤트 핸들러 목록을 추가하고 있다고 생각합니다. 이벤트 핸들러를 제거하려면 델리게이트의 인스턴스를 저장 한 다음 해당 인스턴스를 제거해야합니다. - = 새로운 EventHandler (...)는 핸들러를 제거하지 않을 것입니다.

+0

Listview에는 selectedIndex 속성이 없습니다. Multiselect가 faqlse 인 경우 SelectedIndices 컬렉션에는 하나만 있어야합니다. 여전히 다중 선택이 꺼져 있든 없든, 그 행동은 똑같습니다. 핸들러 (제거 및 추가)가 제대로 작동하는 방식입니다. 그렇지 않으면 hanlder가 ... – Abdu

+0

... 'Selected = true'문으로 인해 무한 루프가 발생합니다. – Abdu

0

가장 좋은 방법은 이벤트를 실행하지 말고 true이라고 말하도록 설정 한 부울 속성을 사용하는 것입니다. SelectedIndexChange 이벤트에서 사용자가 반환 한 이벤트가 계속 실행되도록 허용해야하는지 여부를 테스트합니다. 내 코드를 확인하십시오. 아래 코드는 동일하게 동작합니다.

 //somewhere on top 
    private bool dontFireEvent = false;   

    //somewhere else 
    dontFireEvent = true; 
    treeView1.SelectedNode = treeView1.Nod.... bla bla //event won't fire 
    dontFireEvent = false; 

    //within the event code 
    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) 
    { 
     if (!dontFireEvent) 
      ProcessLogin(); 
    } 
관련 문제