2012-10-05 2 views
1

이것은 다소 다른 질문이거나 쉬운 질문입니다. 하지만 지금은이 문제가 있습니다.양식이 인스턴스인지 양식인지를 확인하는 방법

나는 loginForm, mainFormsubForm의 세 가지 형태가 있습니다.
loginForm에는 두 개의 계정이 있는데, 하나는 mainForm 액세스 용이고 다른 하나는 subForm 액세스 용 계정입니다.
mainFormAccessAccountmainFormsubForm에 모두 액세스 할 수 있지만 subFormAccessAccountsubForm에만 액세스 할 수 있습니다.
mainForm을 통해 subForm의 다중 인스턴스를 만들 수 있습니다 (mainForm은 단일 인스턴스 임).

지금 내 문제는이다 : 나는 subForm와 인스턴스 (mainForm 만든 경우) 다른 subForm_Closed 이벤트 기능을 구현하고 싶습니다.

:

내가 subForm.cs

private mainForm MainForm; 
    internal void RegisterParent(mainForm form) 
    { 
     this.MainForm = form; 
    } 

mainForm.cssubForm의 인스턴스를 만들 수있는에 subForm의 인스턴스를 생성하기 위해 아래의 코드를 사용, 나는 아래의 코드를 사용

subForm newSubForm = new subForm(); 
newSubForm.Show(); 
newSubForm.RegisterParent(this); 

이 문제를 어떻게 해결할 수 있습니까?
(내가 닷넷 놈이므로 인스턴스를 호출했는지 여부는 알 수 없음)

감사합니다.

+0

당신이 내 설명의 어떤 부분을 이해하지 못할 경우 알려 주시기 바랍니다 기술을 데리러으로, 생성자 작업을 진행, 당신이에이 바보 영리한 진행 할 수 있습니다보고. –

+1

실제 질문이 무엇이든간에 "어떻게이 문제를 해결할 수 있습니까?" 무슨 문제 야? 마주 치게되는 문제는 무엇입니까? –

+0

@BobHorn 'subForm'과 그 인스턴스에 대해 서로 다른 Form closed 이벤트 함수를 제공해야합니다. 나는 영어로 가난하다. 내 설명을 이해한다면 편집하십시오. –

답변

2

문제점을 올바르게 이해하면 SubForm의 닫기 이벤트에 대해 서로 다른 두 개의 핸들러가 필요합니다. subFormAccessAccount

  • MainForm 당신은 의심으로
  • 통해 생성 된 하위 폼의 가까운 이벤트에 대한 또 다른 핸들러를 통해 생성 된 하위 폼의 가까운 이벤트에 대한

    1. 한 핸들러는,이 참으로 당신부터 쉬운 문제이고 당신이 언급했다 .net의 noob 나는 자세하게 설명하려고합니다.

      내가 잘못하지 않으면 비주얼 스튜디오 디자이너 표면을 사용하여 subForm_Closed 이벤트 핸들러를 생성했습니다. 이것은 당신 혼란의 원인 인 것 같습니다. 를 열 SubForm.cs이 생성자의 정의를 통지하는 경우

      : 비주얼 스튜디오 디자이너를 무엇

      이벤트 핸들러를 생성 할. 그것은이 InitializeComponent 방법은 SubForm.designer.cs 파일에 설명이

      public SubForm() 
      { 
          InitializeComponent(); 
          //May be some other code as well 
      } 
      

      같은 것() (솔루션 탐색기에서 SubForm.cs을 확장 당신은 그것을 볼 수있을 것이다).InitializeComponent 방법 라인의

      하나는 내가 실제 개체의 인스턴스를 의미하지 의미에서 당신이 언급 한 여기 (바로이 하위 폼 '예'를 만들 때 효과 그래서이

      this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.SubForm_Closed); 
      

      같은 것 SubFormAccessAccount 또는 MainForm 통해 귀하의 질문에 기껏해야 자식 폼), 그것은 당신의 SubForm_Closed 이벤트 처리기를 FormClosed 이벤트에 연결합니다.

      원하는 동작을 어떻게 얻을 수 있습니까? 당신이 SubForm.cs의 폐쇄 이벤트를 처리 할 경우 MainForm.cs의 폐쇄 이벤트를 처리하려면

      , 당신은 당신이

      같이 할 수있는,이

      internal void RegisterParent(mainForm form) 
      { 
          this.MainForm = form; 
          this.FormClosed -= SubForm_Closed; //Unhook previous handler 
          this.FormClosed += SubFormAsChild_Closed; //hook new handler 
      } 
      

      과 같은 작업을 수행 할 수 있습니다

      internal void RegisterParent(mainForm form) 
      { 
          this.MainForm = form; 
          this.FormClosed -= SubForm_Closed; 
      } 
      
      //in MainForm.cs 
      newSubForm.RegisterParent(this); 
      newSubForm.FormClosed += newSubForm_Closed; 
      
    +0

    자네는 내 설명을 바르게 이해했고 너에게서 더 많은 새로운 것을 배웠다. 고맙습니다. 나는 이것을 시도 할 것이다. –

    +0

    도와 줘서 기뻐요 :) –

    +0

    완벽하게 작동했습니다. :) –

    0
    subForm newSubForm = new subForm(); 
    newSubForm.Show(); 
    newSubForm.RegisterParent(this); 
    newSubForm.Close += (s, e) => 
    { 
        // Close event will be fired for this instance only. 
    }; 
    
    0

    mainform - subform을 참조하는 다른 구조를 사용하는 것이 좋습니다.

    하위 폼은 System.Windows.Forms.Control에서 파생됩니다. System.Windows.Forms.Control에서 파생됩니다. 실제로는 부모 컨트롤을 저장하는 속성이 이미 하나 있습니다. 그래서 참조를 저장해야합니다. 주요 양식.

    다른 점은 정적 폼을 구현하여 mainform에 하위 폼을 만들어야한다는 것입니다.이 폼은 단일 인스턴스 참조의 개인 메서드를 호출하여 실제 하위 폼을 만듭니다. 즉, 당신에게 당신이 싱글 톤 패턴이라고 가정합니다.

    그래서 코드는 내가 바로 지금 IDE를 가지고 있겠지 ... 코드가 약간의 입력 오류가있는 경우 aplogize하십시오이

    public class MainForm : System.Windows.Forms.Form 
    { 
        // used to hold references to subforms note: not static 
        private List<SubForm> mySubForms; 
    
        // singelton implementation 
        private static MainForm theInstance = null;  
        private MainForm() 
        { 
        mySubForms = new List<SubForm>(); 
        } 
        public static MainForm GET_INSTANCE() 
        { 
        if (MainForm.theInstance == null) 
        { 
         MainForm.theInstance = new MainForm(); 
        } 
        return MainForm.theInstance; 
        } 
    
        // creates subforms and the references right not:static method as singelton 
        //pattern is used 
        public static SubForm CREATE_SUBFORM() 
        { 
        SubForm newSub = new SubForm(); 
        newSub.Parent = theInstance; 
        theInstance.mySubForms.Add(newSub); 
        return newSub; 
        } 
    } 
    

    과 같을 것이다. Obiously 나는 singelton 패턴 threadsafe 구현하지 않았다 ... 이것은 데모 목적을위한 가장자리를 corss 것입니다.

    편집 : 더 나은 방법은 evetns를 사용하여 양식을 comunicate하게하는 것입니다. 다중 스레드 응용 프로그램을 사용하려는 경우이 방법이 가장 좋습니다. 하지만 고급 .Net 기술이 필요합니다. 또 다른 생성자를 추가 갈

    1

    여러 가지 방법이 하위 폼

    예를 들어,

    public SubForm(Boolean argCreatedByMainForm) : this() 
    { 
    // save argument in private member variable for use in OnCloseQuery 
    } 
    

    후, 유지 보수 악몽으로 설정하는 경향이 하나 개의 형태가 서로에 대해 알고 가지고 있기 때문에, 내가 가고 싶어 방법이 아니다

    subForm newSubForm = new subForm(true); 
    newSubForm.Show(); 
    newSubForm.RegisterParent(this); 
    

    사용하지만, 당신은 몇 가지 더 많은 도구를 필요 했어 더 나은 솔루션을 구현하는 프로그래밍 상자. 예를 들어 양식 간의 간섭을 관리 한 다음 인터페이스로 추상화하는 클래스입니다.

    당신이 배우는 당신이

    +0

    매우 유용한 게시물. :) –

    관련 문제