2010-03-18 4 views
2

TextChanged 이벤트가 선언적으로 설정된 TextBox가 있습니다. 어떤 경우에는 프로그래밍 방식으로이 값을 설정해야합니다. 이 경우 프로그래밍 방식으로 값을 설정할 때까지 TextChanged 이벤트를 비활성화하려고합니다. 그런 다음, 끝나면 이벤트 핸들러를 원래 상태로 복원하려고합니다. 하나의 텍스트 상자를 들어 C# + 프로그래밍 방식으로 이벤트 처리기로 작업하기

, 나는 내가 다음을 수행하여이 작업을 수행 할 수 있습니다 알고

myTextBox.TextChanged -= myTextBox_TextChanged; 
myTextBox.Text = "[Some Value]"; 
myTextBox.TextChanged += myTextBox_TextChanged; 

는 그러나, 나는 여러 가지 방법으로 액세스 할 수있는 하나의 방법으로이 기능을 쓰고 싶어요. 예를 들어, 다음과 같이하려고합니다.

private void UpdateTextValue(TextBox textBox, string newValue) 
{ 
    object eventHandler = textBox.TextChanged; 
    textBox.TextChanged -= eventHandler; 
    textBox.Text = newValue; 
    textBox.TextChanged += eventHandler; 
} 

불행히도이 방법은 효과가 없습니다. 그것은 심지어 컴파일되지 않습니다. 위에 표시된 것과 같은 메소드에서 수행하려고하는 기능을 캡슐화 할 수있는 방법이 있습니까? 그렇다면 어떻게?

고마워요,

답변

3

기본적으로 할 수 없습니다. 이벤트가 노출되는 유일한 기능은 가입 및 가입 취소입니다. 기존 핸들러 세트를 요청할 수는 없습니다. 기존 처리기가 코드에있는 경우 "현재 변경된 모든 변경 사항 무시"를 의미하는 플래그를 설정할 수 있지만 다른 모든 처리기를 효과적으로 제거 할 수는 없습니다.

3

나는 존이 맞다고 생각한다. 그러나 나는 잘못된 각도에서 문제에 접근하고 있다고 생각합니다.

실제로 TextBox의 동작을 변경하려는 경우 내 기본 설정은 TextBox 하위 클래스 일 것이고 부울 값 플래그 FireOnTextChanged를 추가하고 부울 값이 true 인 경우에만 이벤트를 실행합니다 . 그렇게하면 이벤트 핸들러를로드하거나 언로드하는 것에 대해 걱정할 필요가 없습니다.

2

파생 된 텍스트 상자를 만들고 TextChanged 이벤트를 재정 의하여 처리기 추가/제거 핸들러를 캡처 할 수 있습니다.

public MyTextbox:Textbox 
{ 
    public Event EventHandler TextChanged 
    { 
     add 
     { 
      //set the base 
      //store locally 
     } 
     remove 
     { 
      //remove from base 
      //remove from local store 
     } 
    } 

    public string Text 
    { 
     get 
     { 
      //return the base 
     } 
     set 
     { 
      //remove local handlers from base 
      //set value in base 
      //reassign handlers. 
     } 
    } 
} 
0

는 잘 모르겠어요

MulticastDelegate보기 그러나 나는 같은 것을 할 수 있다고 생각 : using System.Linq;

에서 오는

Clone()

Delegate[] invocationList = TextChanged.GetInvocationList().Clone(); 
    foreach (EventHandler h in invocationList) { 
     try { 
      TextChanged -= h 
     } catch (Exception exception) { 
      Console.WriteLine(exception.Message); 
     } 
    } 
    foreach (EventHandler h in invocationList) { 
     try { 
      TextChanged += h 
     } catch (Exception exception) { 
      Console.WriteLine(exception.Message); 
     } 
    } 

UPDATE를

관련 문제