2009-10-28 3 views
4

ASP.NET 웹 페이지의 여러 컨트롤에 단일 이벤트 처리기를 사용하려고합니다. 이미 존재하지 않는 경우에만 런타임에 이벤트 처리기를 추가하고 싶습니다. 아래와 같이 C#에서, 나는 그것을 작성합니다 마찬가지로VB.NET에 이벤트 처리기를 프로그램으로 추가하지 않는 경우

if (myTextBox.OnTextChanged == null) 
{ 
    myTextBox.OnTextChanged += DoTextChangingValidation; 
} 

, 나는 다음과 같이 내가 이벤트 핸들러를 제거 할 수 있습니다 알고

if (myTextBox.OnTextChanged != null) 
{ 
    myTextBox.OnTextChanged -= DoTextChangingValidation; 
} 

내가 추가하고 이벤트 핸들러를 제거하는 방법을 알고 Visual Basic에서 ... 그러나 이미 할당되었는지 확인하는 방법을 어떻게 알아낼 수 있습니까?

+0

작성한 코드는 C#에서 컴파일되지 않습니다. 클래스 외부에서는 이벤트에 대해 처리기를 추가하거나 처리기를 제거하는 2 가지 작업 만 수행 할 수 있습니다. 핸들러 목록을 가져올 수 없으므로'myTextBox.OnTextChanged'는 델리게이트를 반환하는 표현식이 아닙니다. 그 점을 감안할 때, C#에서 실제로 무엇을하는지, 따라서 VB에서하고 싶은 것이 명확하지 않습니다. –

+0

좋아요, 그래서 저는 C#에서 할 수있는 일과 할 수없는 것에 착각했습니다.기본적으로 내가하려고하는 것은 같은 핸들러가 컨트롤에 여러 번 추가되는 것을 방지하는 것입니다. 주어진 시간에 이벤트에 하나 이상의 핸들러가 할당되지 않도록하고 싶습니다. – Michael

답변

7

C# 또는 Visual Basic에서 개체 외부에서 작업 할 수 없습니다. 이벤트는 기본적으로 addremove의 두 접근 자입니다. 당신이 손으로 코드 경우에 즉시 볼 수 그것을 :이 add_Click(EventHandler)remove_Click(EventHandler) 방법이 될

public event EventHandler Click 
{ 
    add { ... } 
    remove { ... } 
} 

. 기본 이벤트 구현을 사용하더라도 접근이 저장하는 이벤트와 이름이 같은 개인 멀티 캐스트 위임 필드를 사용하여 기본 구현으로 당신을 위해 생성 된 것을 제외하고,

public event EventHandler Click; 

그것은 여전히 ​​다른 없습니다 그 핸들러. 클래스의 클라이언트의

  1. , 이벤트가 add 또는 remove 핸들러 약에만 접근이 노출되기 때문에 그들이 할 수있는 유일한 두 가지 :

    이 두 가지를 의미한다. 현재 등록 된 핸들러를 나열하는 접근자가 없습니다.

  2. 필드를 제공하는 이벤트에 대한 기본 구현을 사용하는 경우에도 해당 필드는 여전히 비공개이므로 같은 클래스의 메서드 내에서를 제외하고는 액세스 할 수 없습니다. 그렇게 할 수있는 코드 권한이있는 경우 리플렉션을 사용할 수 있지만 일반적인 솔루션이 아닌 이유는 # 1을 참조하십시오.

이것은 실제로 수행됩니다. 그 이유는 객체가 공유 될 수 있고 다른 코드가 이벤트에 대한 핸들러를 등록했을 수 있기 때문입니다. 처리기 목록에 액세스 할 수 있으면 직접 호출하여 계약 위반 가능성이 있으며 클래스 소유자가 의도하지 않은 방식으로 개인 메서드에 액세스 할 수 있습니다.

이런 종류가 필요하다면 이벤트를 제공하는 클래스에서 수행해야합니다. 자신의 addremove을 작성하여 중복을 확인하거나 속성을 통해 비공개 필드를 노출하십시오.

+0

명확한 설명에 감사드립니다. – Michael

3

이 시나리오에서는 Visual Basic에서 확인하지 않아도됩니다. 일반 제거 구문은 이미 사라진 경우 예외가 발생하지 않도록 현명합니다.

+0

이벤트가 더 이상 처리되지 않으면 아마도 .net에서 예외가 발생해야합니다. 어떻게 생각해? – Tony

+1

@ 토니 - 당신이 그 행동을 좋아한다면, C#을 사용할 수 있습니다. 그러나 C# 프로그래머가 겪어야 할 문제를 기록해 두십시오. 작성해야하는 추가 코드, 잘못된 모든 버그가있는 구현 등 –

+0

기존 핸들러가 아닌 핸들을 제거하려고하면 nullreference 예외가 발생합니다. – Sebastien

관련 문제