문제

이것은 매우 간단하고 매우 일반적인 문제처럼 보입니다. 내가 생각할 수있는 가장 간단한 예는 다음과 같습니다.

양식에는 위에 "모두 확인/확인 없음"확인란이있는 5 개의 확인란이 있습니다. 사용자가 모든 확인란 확인을 선택하면 "어린이"의 상태를 전환합니다. 분명히 모든 체크 박스를 설정할 때까지 모든 어린이의 수표 이벤트를 발사하고 싶지는 않습니다.

양식 전체의 중단 제어 이벤트를 찾을 수 없습니다. 내가 단순히 그것을 놓치면 큰 간단한 대답입니다. 내가 놓친 간단한 솔루션을 제외하고 양식 제어 이벤트를 중단하는 가장 좋은 방법 (모범 사례? 허용 된 솔루션?)은 무엇입니까?

도움이 되었습니까?

해결책

나는 전에 이것을 발견했고 보통 사람들이 이것을하는 것을 보았습니다.

/*SNIP*/

private bool isMassUpdate;

public void Check1_Check(object sender, EventArgs e)
{
   if(!isMassUpdate)
   {
       do some stuff
   }
}

/*SNIP*/

이벤트 핸들러를 분리하고 다시 부를 수 있지만, 이것이 메모리 누출의 원인이 될 수 있다고 들었습니다.

메모리 누출 및 이벤트 처리기에 대한 정보 : 부착 및 분리와 직접 연결되어 있지는 않지만, 상속 트리 아래의 이벤트 처리기를 잘못 참조하면 결과가 발생할 수 있음을 알았습니다.

다른 팁

이 경우 이벤트를 중단하는 부울 가치가있는 대신 카운터를 사용합니다. 카운트가> 0이면 카운트 = 0이면 이벤트를 일시 중지 한 다음 이벤트를 재개하십시오. 이것은 사건의 중단을 요청할 수있는 여러 가지가있는 경우 문제에 도움이됩니다.

또 다른 유용한 점은 블록에 이벤트를 중단해야한다면 "C#에서"블록을 사용하여 사용할 수있는 idisposable 인 약간의 도우미 클래스를 만듭니다. 'M 범위가 없습니다.

다른 질문에서, 나는 당신이 vb .net을 사용하고 있다고 생각합니다. 따라서 removeHandler가 최선의 방법입니다. 일반적으로 VB의 사람들은 Handles 절을 사용하여 이벤트 처리기를 설정합니다. 그러나 당신은 또한 이런 식으로 할 수 있습니다 :

AddHandler chk1.CheckedChanged, AddressOf DoSomething

dosomething이 다음과 같이 보일 수있는 곳 :

Private Sub DoSomething(ByVal sender As Object, ByVal e As EventArgs)
    ' whatever
End Sub

Addhandler가 이벤트를 위로 올리므로 발사됩니다. 발사하지 않으려면 removehandler를 사용하십시오.

RemoveHandler chk1.CheckedChanged, AddressOf DoSomething

자식 확인란의 확인 된 속성을 업데이트하기 전에 각 확인란을 호출하십시오. 그런 다음 완료되면 Addhandler에 전화하여 이벤트 처리기를 다시 넣습니다. 모든 확인란이 동일한 핸들러를 사용하는 경우 컬렉션에 컬렉션에 넣고 핸들러를 추가하거나 제거 할 수 있습니다.

확인이 변경되지 않고 버튼의 '클릭'이벤트를 처리하는 것을 고려할 수도 있습니다. 그것은 당신의 의도에 더 가까울 수 있습니다.

Visual Basic 6.0 응용 프로그램 사용자를 두 번 클릭해야했습니다 모든 것, 내 모든 이벤트 핸들러에는 글로벌 변수를 점검하는 한 줄이 있습니다.

Private bSuspendEvents as Boolean

Private Sub Button1_Click()

    On Error Goto ErrorHandler

    If bSuspendEvents then Exit Sub

    bSuspendEvents = True

    'Do stuff

    NormalExit:
        bSuspendEvents = False
        Exit Sub

    ErrorHandler:
        'Handle Error
        Resume NormalExit

End Sub

스택 오버 플로우 질문을 참조하십시오 C# Windows 양식에서 제어 상태를 변경할 때 간단한 이벤트 발사를 어떻게 무시합니까?

보다 일반적인 경우, 컨트롤 사이에 복잡한 관계가있는 경우 자체 초점을 맞춘 속성을 확인하여 어떤 컨트롤을 해고했는지 확인할 수 있습니다. 각 객체는 그 자체에만 의존합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top