2012-08-23 3 views
3

Windows Forms TreeView 컨트롤을 사용하고 있습니다.TreeView는 BeforeSelect 이벤트를 여러 번 발생시킵니다.

이어 나는 그것이 엮은 한 방법은 간체되어 특정 상황에서

TreeView treeView = new TreeView(); 

treeView.BeforeSelect += beforeSelect; 

private void beforeSelect(sender, args) 
{ 
    MessageBox.Show("Some msg"); 

    // more code 
} 

, 통화은 BeforeSelect 이벤트의 또 다른 상승을 유발 MessageBox.Show 에 다른 하나를 트리거하는 또 다른 ...

이 이벤트는 트리 뷰에서 발생합니다 (나는 발생 횟수를 계산했습니다).

나는 인터넷에서이 문제가 발생할 수있는 이유에 대한 자세한 정보를 검색했습니다.

내가 발견 한 한 가지는 포커스를 얻을 때 TreeView가 자동으로 첫 번째 노드를 선택한다는 것입니다. 그러나 트리에서 트리 노트 항목의 수로 이벤트가 시작되는 이유는 여기에 설명되어 있지 않습니다.

어떤 도움을 주시면 감사하겠습니다. Microsoft Connect 버그를 제기하는 것을 고려 중입니다. 컨트롤이 작동해야한다고 생각하는 방식과 일치하지 않는 매우 이상한 동작처럼 보입니다.

답변

3

다음과 같이 단순히 자신을 차단하는 것으로 충분합니까?

private bool _inside; 

private void beforeSelect(object sender, EventArgs args) 
{ 
    if (!_inside) 
    { 
     _inside = true; 

     MessageBox.Show("Some msg"); 

     // more code 

     _inside = false; 
    } 
} 

이렇게하면 함수의 "재귀 적"호출을 허용하지 않습니다.

+1

나는 유사한 것을했다. (나중에 다시 추가하면, 메서드를 입력 할 때 이벤트 핸들러와 분리된다.) –

3

BeforeSelect 이벤트는 기본적으로 여러 번 실행되지 않습니다.

노드를 선택하면 선택 이벤트 또는 작업을 중단하는 대화 상자 (여기서는 메시지 상자)가 표시되고 대화 상자를 닫으면 중단 이벤트를 기반으로 선택 이벤트가 다시 발생합니다. 객체를 정의 할 때

void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
{ 
    e.Node.Tag = (int)(e.Node.Tag ?? 0) + 1; 
    int count = (int)(e.Node.Tag); 
    e.Node.Text = String.Format("selected {0} Count: {1}", e.Action.ToString(), count); 
} 
+5

유효성 검사를 위해 MessageBox가 필요합니다 (보류중인 변경 내용을 저장 하시겠습니까?) –

-2

, 당신처럼 작성해야 실행 - 당신은

이 코드를보고하십시오 .. ... 일을 할 트 리뷰의 AfterSelect 이벤트를 사용하여 단지 확인을위한 BeforeSelect한다 이;

진정한 쓰기 :

private static TreeView projectagac; 
... 
... 
... 
projectagac = new TreeView(); 

따라서 당신은 단지 하나의 객체를 생성합니다.

관련 문제