2010-06-23 6 views
3

폼에 여러 개의 컨트롤이 있고 "change"이벤트가 모두 같은 이벤트 처리기를 가리키고 있습니다. 이들 중 일부는 txtInput1의 TextChanged, chkOption1의 CheckedChanged 및 cmbStuff1의 SelectedIndexChanged입니다. 사용자가 텍스트 상자의 텍스트를 변경하거나 체크 박스 또는 무엇이든을 클릭 할 때 문 만 실행하는 경우사용자 작업 또는 코드에 의해 이벤트가 발생했는지 어떻게 확인할 수 있습니까?

private void UpdatePreview(object sender, EventArgs e) 
{ 
    // TODO: Only proceed if event was fired due to a user's clicking/typing, not a programmatical set 
    if (sender.IsSomethingThatTheUserDid) // .IsSomethingThatTheUserDid doesn't work 
    { 
     txtPreview.Text = "The user has changed one of the options!"; 
    } 
} 

내가 좋아하는 것 : 여기에 이벤트 핸들러입니다. 텍스트 나 체크 박스가 프로그램의 다른 부분에 의해 변경되면 나는 그것을 원하지 않습니다.

+0

나는 최근에 정확히 같은 질문에 대답 했다며 맹세했다. –

+1

여기있다. 정확히 완전한 복제본은 아니지만 그 대답은 여전히 ​​동일합니다. http://stackoverflow.com/questions/3071811/listbox-selectedindexchanged-can-you-determine-if-it-was-user-intiated/3071856 –

+0

Can 당신은 "텍스트 나 체크 박스가 프로그램의 다른 부분에 의해 변경되면 나는 그것을 원하지 않는다"는 것을 의미하는 것을 분명히합니다. – Doug

답변

9

이렇게하는 기본 제공 메커니즘이 없습니다. 그러나 플래그를 사용할 수 있습니다. 당신은 당신의 코드에서 UI 업데이트 할 때 다음

bool updatingUI = false; 

private void UpdatePreview(object sender, EventArgs e) 
{ 
    if (updatingUI) return; 

    txtPreview.Text = "The user has changed one of the options!"; 
} 

:

private void UpdateUI(Action action) 
{ 
    updatingUI = true; 

    action(); 

    updatingUI = false; 
} 
: 당신이 솔루션을 지나치게 엔지니어링하려면

updatingUI = true; 

checkBox1.Checked = true; 

updatingUI = false; 

를, 다음과 같이 사용할 수 있습니다

그리고 다음과 같이 사용하십시오 :

UpdateUI(()=> 
{ 
    checkBox1.Checked = true; 
}); 
+0

감사합니다. 저는이 작업을 수행하는 기본 제공 메커니즘이 있다고 가정했습니다. 플래그를 사용하겠습니다. 또한 마지막 코드 블록에서 구문을 사용하여 새로운 것을 배웠습니다. – Coder7862396

+0

@Coder : 람다 식이라고 부릅니다. 그들에 대한 많은 정보를 찾아야합니다. 행운을 빕니다! –

-1

발신자를 확인할 수 없습니까? 유선 이벤트에서 UI 컨트롤로 호출되면 컨트롤로 돌아옵니다. 당신은 코드에서 이벤트를 트리거하는 경우,이 중 하나를 호출하는 구성 요소가 될 것이다, 또는 당신은 당신이 원하는 것이 무엇이든 만들 수 :

private void SomewhereElse() 
{ 
    UpdatePreview(null, new EventArgs()); 
} 

private void UpdatePreview(object sender, EventArgs e) 
{ 
    if (sender == null) 
    { 
     txtPreview.Text = "The user has changed one of the options!"; 
    } 
} 

또는 당신이 할 수 있습니다 :

private void UpdatePreview(object sender, EventArgs e) 
{ 
    if (!(sender is Control)) 
    { 
     txtPreview.Text = "The user has changed one of the options!"; 
    } 
} 
+0

올바르지 않습니다. 보낸 사람은 항상 이벤트를 발생시키는 개체입니다. 'Text' 속성이 입력에 의해 또는 코드에 의해 변경되었는지 여부에 관계없이,'sender' 변수는 항상 이벤트를 발생시키는 텍스트 상자의 인스턴스가됩니다. –

+0

다른 곳에서 호출되는 "UpdatePreview()"가 아니며, 텍스트 또는 체크 상자 (txtInput1.Text = "Hello from somewhere else")의 설정입니다. – Coder7862396

+0

@Adam - 게시 된 답변에 대한 견해에서 올바르지 않습니다. 문제. 나는 그가하려고 한 것을 잘못 읽었습니다. 내 대답은 내가 게시 한 맥락에서 정확합니다. @ Coder7862396 - 당신이 옳습니다. 나는 원래의 게시에서 그것을 놓쳤다. – Robaticus

관련 문제