2009-07-01 4 views
1

양식이 있습니다. 이 양식에는 사용자 정의가 있습니다. 이 사용자 정의 컨트롤에는 패널과 컨텍스트 메뉴가 있습니다. 상황에 맞는 메뉴는 패널에 연결되어 있지 않습니다. 동적으로 생성되어이 패널에 추가되는 다른 컨트롤이 있습니다. 이러한 컨트롤 중 하나는 버튼입니다. 이 버튼을 클릭하면 컨텍스트 메뉴에 contextmenustrip 속성을 설정합니다.컨트롤 컬렉션에서 컨텍스트 메뉴를 찾을 수 없습니다.

제 문제는 버튼에 상황에 맞는 메뉴를 첨부 할 수있는 기회가 있기 전에 해당 상황에 맞는 메뉴의 항목을 읽어야한다는 것입니다.

양식이로드 될 때마다 양식의 모든 하위 컨트롤을 반복합니다. 컨트롤에 자식이있는 경우 해당 내용을 반복합니다 ... 등등 ... 컨텍스트 메뉴에 표시되지 않아서 말할 수없는 것 같습니다. 컨트롤에 첨부되지 않았으므로 폼의 컨트롤에 대한 자식 컨트롤이 아닌 것으로 보입니다.

myConectMenu는 this.Controls.Add (myConectMenu)와 같이 사용자에게 추가되지 않습니다. 해당 상황에 맞는 메뉴가 양식 컨트롤 컬렉션에 중첩되지 않는 이유는 무엇입니까? 해당 컨텍스트 메뉴에서 어떻게 얻을 수 있습니까?

private System.Windows.Forms.ContextMenuStrip myContextMenu; 

void InitializeComponent() 
{ 
    this.myContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); 
    this.myContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 
    this.myToolStripMenuItem1, 
    this.myToolStripMenuItem2}); 
    this.myContextMenu.Name = "myContextMenu"; 
    this.myContextMenu.Size = new System.Drawing.Size(158, 92); 
} 

업데이트 제어 반복이 내 응용 프로그램의 모든 형태의 파생되는 기본 클래스에서 발생 : 여기

디자이너 코드입니다.

myContextMenu가 추가되는 개인 구성 요소 개체가 있습니다. 이것이 컨트롤에 연결되어 있지 않을 때 디자인보기에서 컨텍스트 메뉴를 볼 수 있도록 상상해보십시오. 아마도 내가 이것을 활용할 수 있을까요?

private System.ComponentModel.IContainer components = null; 

this.myContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); 
+0

ContextMenuStrip으로 무엇을하고 싶은지 설명 할 수 있습니까? –

+0

은 자식 컨트롤을 반복하고 사용자가 액세스 할 수없는 항목을 사용하지 않도록 설정합니다. –

답변

1

컨텍스트 메뉴에서 파생 된 사용자 지정 컨텍스트 메뉴 (내 경우 SecureContextMenu)를 만듭니다. 공개 이벤트를 구현하고 승인되지 않은 항목을 비활성화하는 항목 컬렉션을 반복합니다.

열린 이벤트가 처음 발생할 때 HasBeenOpened 속성을 만들어 true로 설정하면 컨텍스트 메뉴가 열릴 때마다 동일한 컨트롤을 계속 확인할 필요가 없습니다.

승인 된 항목 목록에 대해 상황에 맞는 메뉴 항목을 선택하려는 모든 곳에서 SecureContextMenu를 사용하십시오.

+1

나는 이것이 내가 비난 한 것보다 훨씬 좋다고 생각한다. 잘 했어. :) – SolutionYogi

0

IT는 성분 아닌 형태로 부착 제어이다. 다른 양식과 비교하십시오. 다른 양식의 양식을 수동으로 .Show() 할 수 있지만, 다른 양식의 .Control 컬렉션에 어떤 양식도 표시되지 않습니다. 음, 아마도 그 비유가 최고가 아니었을 수도 있습니다 ... :

+0

양식의 기본 클래스에서 해당 구성 요소를 직접 사용할 수 있습니까? –

3

올바르게 관찰했듯이 myContextMenu는 컨트롤 연결에 추가되지 않았습니다. 컨트롤에는 확인해야하는 ContextMenuStrip 속성이 있습니다.

public void FindContextMenuStrip(Control input) 
{ 
    foreach(Control control in input.Controls) 
    { 
     if(control.ContextMenuStrip != null) 
      DoSomethingWithContextMenuStrip(control.ContextMenuStrip) 

     if(control.Controls.Count > 0) 
      FindContextMenuStrip(control); 
    } 
} 

관련 코드를 DoSomethingWithContextMenuStrip 메서드에 넣습니다.

편집 : 당신은 당신이 ContextMenuStrip을 함께하고 싶었던 것을 지정된 곳

나는 당신의 코멘트를 보았다.

사용자 세부 정보를 가져와 컨텍스트 메뉴 스트립을 만드는 기본 클래스의 메서드를 만드는 방법은 어떻습니까?

public ContextMenuStrip GetContextMenuStripForUser(User user) 
{ 
    //code to create context menu strip, with only those items enabled for which user has access. 
} 

최종 양식에서이 방법을 사용하여 ContextMenuStrip을 가져옵니다.

+0

컨텍스트 메뉴가 contextmenustrip 속성을 통해 컨트롤에 할당 된 경우 효과적입니다. 내 경우에는 사용자가 양식과 상호 작용할 때까지 컨텍스트 메뉴가 컨트롤에 지정되지 않습니다. 나는 사용자 상호 작용 이전에 그 상황에 맞는 메뉴를 찾아야한다. –

+1

그런 경우, 내가 생각할 수있는 유일한 방법은 기본 클래스에 ContextMenuStrip을 컨트롤에 추가하는 방법을 사용하는 것입니다. 이 메서드에서 원하는대로 ContextMenuStrip을 조작 할 수 있습니다. – SolutionYogi

+0

좋은 아이디어. 너는 나에게 또 다른 생각을했다. 내 anwser를 확인하십시오. –

관련 문제