2011-12-05 3 views
1

CheckedChanged 이벤트 (또는 다른 C# 이벤트)가 사용자 이벤트로 선언되는 방법이 있습니까? 문제는 코드에서 Checked 속성을 변경하면 이벤트가 호출되고 이것이 원하지 않는 것입니다 (예 : MFC에서 이벤트는 속성 이벤트와 반대되는 사용자 이벤트 임). 부울 플래그로 전달하면 2011 년에 조금 어색해집니다!사용자 이벤트 - 예 체크 박스

+2

변경 사항이 발생한 곳을 돌보는 경우 큰 실수가 있습니다. 체크 상자가 코드에서 설정되면 왜 중요합니까? – Jon

+0

@ 존 - 당신은 아주 좋은 지적을했습니다. 드문 경우지만 이벤트가 사용자 생성인지 코드 생성으로 생성되었는지 대부분 추상화해야하는지 알면 도움이 될 수 있습니다. –

+0

@Jon 유용 할 때가 몇 가지 있습니다. 예를 들어 사용자가 상자를 검사 할 때 로그에 기록하려는 경우 또는 사용자가 확인란을 선택했을 때 메시지 상자를 표시하고 코드에서 호출 할 때는 메시지 상자를 표시 할 필요가없는 경우. 물론, 다른 계층과 같은 종류의 기본 변수를 추가하여 더 나은 아키텍처를 얻을 수는 있지만, 단순한 예외를 과도하게 엔지니어링하는 것일 수 있습니다. – DonkeyMaster

답변

2

이벤트를 등록 취소 할 수 있습니다. 값을 변경하면 다시 구독 할 수 있습니다.

this.checkBox1.CheckedChanged -= new EventHandler(checkBox1_CheckedChanged); 
this.checkBox1.Checked = true; // will not firing the CheckedChanged event 
this.checkBox1.CheckedChanged += new EventHandler(checkBox1_CheckedChanged); 

alternativly이 도움이

희망을 작동이

bool isUser = true; 

public Form1() 
{ 
    InitializeComponent(); 

    isUser = false; 
    this.checkBox1.Checked = true; 
    isUser = true; 
} 

void checkBox1_CheckedChanged(object sender, EventArgs e) 
{ 
    if (!isUser) // check if the change has fired by user 
     return; 

    // ... 
} 

모두 같은 우회 변수를 설정할 수 있습니다.

+0

유망한 것 같아서 고마워. 이 기사는 내가 한 일이다. 구독 취소는 하나의 이벤트가 다른 이벤트와 상호 작용하기 때문에 더 명확하지만 다른 방법은 혼란 스럽습니다. – Sunscreen

+0

내가 당신을 도울 수 있다면 기뻐. – dknaack

+0

'this.checkBox1.CheckedChanged - = new EventHandler (checkBox1_CheckedChanged);라고 쓰는 것은 어색함을 느낀다;'새로운 EventHandler (checkBox1_CheckedChanged)'가 아닌가? 그렇다면 새로운 객체는 이미'CheckedChanged' 컬렉션에 존재할 수 없습니다. 나는이 코드가 당신이 암시하는대로 작동한다는 것을 당신의 말에 믿을 것입니다. – DonkeyMaster

1

C#은 "사용자 이벤트"를 확실히 지원하지 않습니다. 키워드 이벤트를 사용하여 지정되는 한 가지 유형의 이벤트 만 지원합니다 (기본적으로 대리자 참조로 제어 됨). C#이 이벤트를 취급하는 방법에 대해 좀 더 배우고 싶다면 Jon Skeet's excellent treatment of the subject here을보십시오.

지금, 당신이 비교하는 것은 실제로 사과에 사과가 아닙니다. MFC는 프레임 워크입니다. C#은 언어입니다. 따라서 프레임 워크에 관한 한 프레임 워크에 따라 다릅니다. 귀하의 예에서는 WinForms를 언급 한 것처럼 보입니다. 다시 말하면 대답은 불행히도 아니오입니다. WinForms는 사용자 이벤트를 설명 할 때 "사용자 이벤트"를 지원하지 않습니다.

관련 문제