문제

어떻게 e.Cancel 이벤트에서 작업에서 formclosing 이벤트에 WinForm?난 당신이 그것을 놓 True 을 취소 마감,그러나 어떤 시점에서는 양식 프로세스 이?거기에 보조 조치에 의해 촬영설턴트를 제공합니다.

어떻게 유사한 조치를 이행하는 사용자 정의 컨트롤?(C#또는 VB)

참고: 나는 보았다 약 30 분 동안 지금 및 수 없었는 어떤 대답을 찾을 구글에서 또는 그렇게 검색,그래서 그는 경우 그것은 중복,내 나쁘다.

도움이 되었습니까?

해결책

내 생각에는 원래 포스터가 무엇인지 궁금 할 때 발생하는 몇 가지 설정 구내구독자 Cancel = false 고 일부는 구내구독자 설정 Cancel = true.이 경우,다음 질문에"때 양식 과정"이에서 더 중요합니다.

처음에는 제가 궁금했는지 여부를 세터로 구현되었거나 또는 그 각각의 값입니다.용 반사체 하는 검사에 대한 세터 CancelEventArgs.Cancel 쇼 그것은 단순히 세트 프라이빗 필드:

public bool Cancel
{
    get{ return this.cancel; }
    set{ this.cancel = value; }
}

그래서 저는 생각으로 엿보기'형태입니다.OnClosing(CancelEventArgs args)'표시할 때에 값을 선택하는 이전처럼 답변,하지만 무엇을 반사체를 보여줍니다:

[EditorBrowsable(EditorBrowsableState.Advanced)]
protected virtual void OnClosing(CancelEventArgs e)
{
    CancelEventHandler handler = (CancelEventHandler) base.Events[EVENT_CLOSING];
    if (handler != null)
    {
        handler(this, e);
    }
}

그래서 저는 소스를 디버깅하고 찾을 얻 EVENT_CLOSING 에서 대리인 Events 컬렉션이 떨어 깊은 곳으로 윈도우 API 러 handler 에서의 첫번째 줄 OnClosingnull 때 양식 세트 Cancel = true, 을 의미하는 관리되는 코드는 정말는지 여부를 테스트 CancelEventArgs.Cancel == true.당신이 원하는 경우 추한 용기 내부에서 무슨 일이 일어나는지 이 EventHandlerList,당신이 얻을:

get { 
    ListEntry e = null;
    if (parent == null || parent.CanRaiseEventsInternal) 
    {
        e = Find(key);
    }
    if (e != null) { 
        return e.handler;
    } 
    else { 
        return null;
    } 
}

디버깅하는 동안, parent.CanRaiseEventsInternal 은 경우 false 를 닫는 취소되었습니다.

그래서...의 실제 구현을 취소하의 형태로 이전보다 더 복잡하 답변,하지만 그들의 제안하는 방법에 대한 취소는 자신의 이벤트가 올바르게 수행하는 방법을 보여주고 관리되는 코드입니다.전화 CancelEventHandler 다음의 값을 테스트 CancelEventArgs.Cancel 모든 가입자 기회를 값을 설정 true.이것은 아직도 대답하지 않으면 무엇이 일어나 일부를 구내구독자 설정 Cancel = false 일부 설정 Cancel = true.누가 알아?것 다음과 같이 필요합니까?

public bool Cancel
{
   get{ return this.cancel; }
   set{ this.cancel = this.cancel || value; } 
}

다른 팁

Windows 양식에 사용되는 표준 이벤트 생성 패턴에 따라 :

public event CancelEventHandler MyEvent;

protected void OnMyEvent(CancelEventArgs e) {
  CancelEventHandler handler = MyEvent;
  if (handler != null) {
    handler(this, e);
  }
}

private void button1_Click(object sender, EventArgs e) {
  CancelEventArgs args = new CancelEventArgs();
  OnMyEvent(args);
  if (!args.Cancel) {
    // Client code didn't cancel, do your stuff
    //...
  }
}
function OnMyCancelableEvent()
{
   var handler = CancelableEvent;
   var args = new CancelEventArgs()
   if(handler != null)
   {
        handler(this, args)
        if(args.Canceled)
           // do my cancel logic
        else
           // do stuff
   }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top