2012-07-20 5 views
0

내 mainform에 usercontrols를 추가하는 함수를 만들려고합니다. 나는이 함수를 usercontrols에서도 사용할 수 있기를 원하기 때문에 정적으로 만들고있다.winforms의 정적 메서드에서 usercontrols를 추가하는 방법은 무엇입니까?

내 문제는 정적 인 경우 this.Controls.Add(ucontrol);을 사용할 수 없다는 것입니다. ActiveForm.Controls.Add(ucontrol);으로 변경하려고했지만 ActiveForm이 NULL이고 컨트롤 속성이 없습니다 (예외가 발생 함).

업데이트 # 1 :

MainForm ref_to_mainform_to_gain_access_to_functions = (MainForm)Parent;  
ref_to_mainform_to_gain_access_to_functions.DisplayControl(ucontrol);   

어쩌면 더 나은,하지만 나는 여전히 정적 메서드에서 mainform에 액세스하는 것이 가능하다 가정을 :은 내가 UserControl을 내부에이 같은 일을 결국?

업데이트 # 2 :

Application.OpenForms["FormName"] 

는 정적 메서드에서 일했다.

나는 그 usercontrol 전체 목적이 다른 usercontrols onclick을 보여주는 버튼이있는 메뉴로 사용되는지 알아 내려고 여전히 mainform (usercontrols를 보여주는 함수)을 호출하는 '디자인 범죄' 사용자 정의 컨트롤에서? (내가 '업데이트 # 1'에서했던 것처럼)

+2

이것은 Winforms가 잘못하고 있음을 상기시키는 방법 중 하나입니다. 사용자 컨트롤은 부모에게 컨트롤을 추가하지 않아야합니다. 이벤트를 발생시킵니다. –

+0

@HansPassant - 왜 그렇게 잘못 됐는지 설명해 주시겠습니까? – BornToCode

답변

1

사용자 컨트롤에서 상위로 컨트롤을 추가하면 관심 분리 원칙을 위반하게되고 두 컨트롤/폼을 밀접하게 결합하게됩니다. Hans Passant가 제안한대로 이벤트를 사용해야합니다. 참조하십시오 : best practices to call methods in the parent form and access gui elements in parent form in c#

+0

그리고 usercontrol의 모든 목적이 다른 usercontrols onclick을 보여주는 버튼이있는 메뉴로 사용되는 경우, 사용자 정의 컨트롤에서 mainform (사용자 정의 컨트롤을 보여주는 함수)을 호출하는 것은 여전히 ​​'디자인 범죄'입니까? (내가 'update # 1'에서했던 것처럼) – BornToCode

+0

예. 당신이하고있는 일은 두 컨트롤을 단단히 묶는 것입니다. 즉, 컨트롤을 단독으로 사용할 수 없으며 함께 사용할 수 없습니다. 이 두 컨트롤을 단일 컨트롤로 병합하면 결과는 동일합니다. 느슨하게 결합 된 구성 요소를 작성하고 관심사를 분리하는 것에 관한 인터넷에는 많은 훌륭한 자료가 있습니다. 나는 당신이 약간의 연구를하고 그 개념을 조사 할 것을 강력히 권합니다. – Bartosz

관련 문제