2014-12-05 5 views
1

나는이 이벤트 핸들러를 특정 조건 하에서 코드에서 선택된 아이템 으로 바꾼다. 이 작업을 수행 할 때 변경 및 다시 실행으로 인해 처리기를 호출합니다. 이 문제를 어떻게 방지 할 수 있습니까?combobox selectionChanged 이벤트가 스스로 리콜되지 않도록하는 C#

MessageBox.Show("Must have a repair report.", "No Report"); 
txtLocation.SelectedItem = MAIN_BACKGROUND.UserName; //here it recalls itself as I return its value to what it was before the change 
+0

@AlexFarber - 불필요한 오버 헤드가 발생합니까? –

+0

@roryap 동의합니다. 아마도 더 많은 비용이들 것입니다. – pquest

+1

양식로드 순서에서이 작업을 수행하고 처리기에서 시도하여 문제가 발생했습니다. 아래의 부울 메소드 사용. – HighARc

답변

3

당신은 동안의 실질적인 작업을 수행 이벤트 몸을 중지 글로벌 부울 값을 사용할 수를 달성하기 위해 "내부"이벤트 핸들러 :

private bool _alreadyChanging = false; 

private void txtLocation_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (!_alreadyChanging) 
    { 
     _alreadyChanging = true; 
     MessageBox.Show("Must have a repair report.", "No Report"); 
     txtLocation.SelectedItem = MAIN_BACKGROUND.UserName; 
     _alreadyChanging = false; 
    } 
} 
2

이벤트 처리기 내에서 변경 사항을 건너 뛰려면 논리를 처리해야합니다. 이렇게하면 이벤트가 다시 시작되는 것을 막을 수 없습니다.

if(txtLocation.SelectedItem == MAIN_BACKGROUND.UserName) 
    return; 

MessageBox.Show("Must have a repair report.", "No Report"); 
txtLocation.SelectedItem = MAIN_BACKGROUND.UserName; 

편집 : 부울 플래그를 사용하는 예를 추가하면 같은 일

public Class class 
{ 

    private bool _shouldHandle = true; 
    public void EventHandler(object Sender, EventArgs e) 
    { 
     if(_shouldHandle) 
     { 
     _shouldHandle = false; 
     //make change 
     _shouldHandle = true; 
     } 
    } 
} 
+0

분명히 당신의 특정 사건에 대한 논리가 무엇인지 확신 할 수 없지만, 이것은 당신이 적어 놓은 것을 바탕으로 최선의 추측입니다. – pquest

+0

'class'는 다른 모든 이벤트 만 처리합니다. '_shouldHandle = true'는'if (_shouldHandle)'블록의 일부분이어야합니다. 처리 된 이벤트가 완료 될 때만 미래 이벤트를 처리 할 때 잠금을 해제합니다. – AWinkle

1

Microsoft는 방지하기 위해 NET 1.1 이후 ComboBox.SelectionChangeCommitted 이벤트 있었다 정확히 그 문제.

사용자이 (가) 해당 콤보 상자를 변경하는 경우에만 해당 이벤트가 발생합니다. 어떤 이벤트에서든지 의 구독을 취소하거나 부울 값을 사용할 필요가 없습니다.

+0

나는이 사건을 들여다 내가 필요한 것에 대해 매우 실행 가능한 해결책 인 것 같다. 나는 WPF를 사용하고 있다고 언급 했어야하는데, 이것이 존재하지 않는다고 말할 수 있습니다. 제안 해 주셔서 감사합니다. 폼 응용 프로그램에서 이것을 사용할 것입니다. – HighARc

관련 문제