2012-05-21 2 views
1

MDI 응용 프로그램의 프로토 타입을 작성 중입니다. mainForm이라는 메인 폼과 다른 child 폼, childForm 클래스의 모든 인스턴스를 가지고 있습니다. 이 childForm 클래스의 인스턴스는 모두 기본 MenuStrip을 가지며 \ close, print 등의 formStripMenuItems 형식을 사용합니다.menustrip 구성 요소를 클릭 할 때 양식의 활성 인스턴스를 식별하는 방법

클릭 할 때, 활성화 된 toolStripMenuItem을 보유하고있는 childForm 클래스의 인스턴스를 어떻게 식별 할 수 있습니까?

편집 : 대시

Form myNewForm = new Form() 
MenuStrip myNewMenu = new MenuStrip() 
... 
myNewForm.Controls.Add(myNewMenu) 
myNewForm.MainMenuStrip = myNewMenu 
+1

부모 속성을 살펴볼 수 있습니다. 그것이 컨트롤이라면 부모를보고 첫 번째 폼에 도달 할 때까지 컨트롤을 호스팅하는 폼이어야합니다. 또한 FindForm 메서드가 컨트롤에 있습니다 - 참조 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.findform – dash

+0

나는 이러한 부모, findForms 및 기타 메서드를 조작하고 속성없이 성공. 내 ToolStripMenuItem 부모는 ToolStripDropDownMenu입니다. 부모 및/또는 FindForm이 null을 반환합니다. –

+0

어떻게 ChildStart의 인스턴스에 MenuStrip을 추가합니까? 디자인 타임에 완료 되었습니까? 그런 다음 런타임에 폼의 인스턴스를 만들면됩니까? 또는 런타임에 MenuStrip을 추가합니까? 동일한 MenuStrip입니까? 아니면 각 양식에 자체 인스턴스가 있습니까? – dash

답변

1

내 원래의 코멘트를 감안하고 업데이트 나를 위해 다음과 같은 작품 :

Form newChildForm = new Form(); 
    newChildForm.Name = "ChildForm"; 
    MenuStrip newMenu = new MenuStrip(); 

    ToolStripItem newItem = newMenu.Items.Add("New Item"); 
    newItem.Click += new EventHandler(newItem_Click); 

    newChildForm.Controls.Add(newMenu); 
    newChildForm.MainMenuStrip = newMenu; 

    newChildForm.Show(); 

그런 다음 이벤트 처리기에

:

void newItem_Click(object sender, EventArgs e) 
{ 
    ToolStripItem clickedItem = sender as ToolStripItem; 

    MenuStrip parentMenu = clickedItem.Owner as MenuStrip; 

    Form childForm = parentMenu.FindForm() as Form; 
    //childForm.Parent is also "ChildForm"; 

} 

당신은 다른 아무것도 있습니까?

+0

이벤트가 MyMenuItem 클래스 수준에서 관리되도록 MyMenuItem 인스턴스를 빌드하는 동안 Click 이벤트가 MyMenuItem : ToolStripMenuItem 개체에 추가되었습니다. 여기서 당신은 폼 레벨에서 이벤트 매니저를 추가 할 것을 제안하고 있습니다 ... 어떤 일을합니다 ... 시간 내 주셔서 감사합니다. –

1

명예, 답변으로 게시되어 있어야합니다 : 대시 코멘트 의사 코드는 다음과 같습니다

다음과 같습니다. 임 당신이 메뉴 항목의 클릭 이벤트 내부에 있다고 가정 할 것

...

Control s = sender as Control;//the sender object from the click event 
ChildForm activeForm = s.FindForm() as ChildForm; 

이 당신이 찾고있는 형태의 특정 인스턴스를 줄 것이다.

양자 택일로, 버튼 클릭 이벤트는 ChildForm 클래스 자체에서 구현되어야하며, 이는 클릭 이벤트 중에 "this"연산자가 실제로 활성화되는 ChildForm 클래스의 특정 인스턴스 여야 함을 의미합니다.

ChildForm activeForm = this; 

완전히 불필요한 지정이지만 요점을 설명합니다. 귀하의 메뉴 막대가 다른 사용자 정의 사용자 정의 컨트롤 컨테이너에있는 경우에는 이와 같은 것이 필요합니다.

ChildForm activeForm = this.ParentForm; 

ParentForm 속성은 다른 컨트롤을 포함 할 수있는 제어로 정의 'ContainerControl'고유이며 컨테이너가 표시되어있는 기본 '형태'를 확인한다.

+0

시도해 보았습니다. 오류가 발생했습니다. 코드를 디버깅 할 때 다음을 확인합니다 :? ((Control) sender) .ToString() 및 메시지 받기 : 'Send'(실제 유형이 'MonApp.FenetreApplication.ItemMenu ') to'System.Windows.Forms.Control '(ItemMenu는 ToolStripMenuItem에서 파생 된 클래스입니다) –

+0

Control을 제네릭으로 사용하고있었습니다. MenuItems는 스스로 제어 할 수는 없지만 컨트롤 인 속한 메뉴를 식별 할 수 있어야합니다. 메뉴 항목의 on_click 이벤트 자체는 어떤 클래스입니까? 그것은 ChildForm, MainForm의 일부 또는 다른 곳의 일부입니까? – Nevyn

관련 문제