2008-09-15 4 views
9

짧은 버전 : 양식을 표시하지 않고 Form_Load() 이벤트를 트리거하고 싶습니다.양식을 표시하지 않고로드하십시오.

tasksForm.Visible = false; 
tasksForm.Show(); 

긴 버전 : 쇼() Visible 속성의 현재 값을 무시하기 때문에 작동하지 않습니다 메인 작업 : 나는 두 가지 형태와 윈폼 응용 프로그램이 있습니다. 기본 양식이 항상 표시됩니다. 사용자는 버튼을 클릭하여 작업 양식을 열거 나 작업 양식을 열지 않고 직접 작업을 실행하는 버튼을 클릭 할 수 있습니다.

사용자가 작업을 직접 실행하도록 요청하면 작업 형식에 대한 공개 메서드를 표시하지 않고 그냥 호출하고 싶습니다. 불행하게도, 작업 로직은 Form_Load() 이벤트에서 일어나는 일들에 달려있다. Form_Load()를 트리거하는 유일한 방법은 Show()를 호출하는 것입니다. 내가 할 수 있었던 가장이 최소화 된 상태에서 폼을 표시하는 것입니다

tasksForm.WindowState = FormWindowState.Minimized; 
tasksForm.Show(); 

내가 깨끗한 솔루션은 작업 형태에서 벗어나 컨트롤러 클래스로 작업 논리를 끌어 될 것 같아요. 그런 다음 주 양식 및 작업 양식에서 해당 클래스를 사용할 수 있으며 사용자에게 표시해야하는 경우에만 작업 양식을로드합니다. 그러나 폼을 표시하지 않고 폼을로드하는 것이 쉬운 경우 작은 변화 일 수 있습니다.

+0

나는 가장 깨끗한 해결책을 제안합니다. 나중에 더 쉽게 유지할 수 있습니다. –

+0

제 답변에서 말했듯이 Scott과 동의하기 때문에 이것을 다시 작성하고 컨트롤러 클래스 경로를 따라야합니다. 좋은 습관입니다. –

답변

7

전적으로 Rich B와 동의합니다. WinForms 메커니즘을 엉망으로 만들지 않고 애플리케이션 로직을 배치 할 위치를 찾아야합니다. 작업 양식이 노출되는 모든 작업과 데이터는 실제로는 별도의 클래스에 있어야하며 일종의 Application Controller 또는 기본 폼이 보유한 항목을 말한 다음 필요한 경우 작업 양식에서 데이터를 읽고 표시하는 데 사용되지만 실제로는 필요하지 않습니다. 존재하도록 인스턴스화 할 양식이 필요합니다.

그것은 아마 재 작업을 위해 고통을 보이지만 앱의 구조를 개선하고 더 유지 보수 만드는 것 등

MSDN에서
+1

* 한숨 * 좋아요, 좋을 것입니다. 모두에게 감사의 말을 전한다. –

9

앉아서 다시 생각해야 할 것처럼 들립니다. 공개 방법을 보여주지 않을 경우 공용 방법을 사용해야하는 단일 이유를 상상할 수 없습니다. 새로운 수업을 시작하십시오.

+0

당신의 포인트에서 외삽 법을 적용하려면 Task 클래스의 Model 클래스와 TaskForm 인 View/Controller 클래스를 가져야합니다. – user7116

+0

@sixlettervariables : 뷰가 필요한 이유는 무엇입니까? 그는 어쨌든 양식을로드하지 않을 것이라고 말했다. 그는 단지 수업이 필요한 것처럼 들립니다. – GEOCHET

+0

나는 그가 데이터를 보지 않을 곳을 놓쳤다. 그게 유일한 질문이라면 비표준 질문의 종류는 ... – user7116

0

메서드를 public으로 설정하면 직접 액세스 할 수 있습니다. 그러나 호출 할 때 예기치 않은 부작용이 발생할 수 있습니다. 그러나 공개하고 직접 호출하는 것은 화면을 그리거나 양식을 열지 않습니다.

0

Load 이벤트 처리기 외부의 양식 클래스에 대한 필수 초기화 코드를 생성자로 이동합니다. Form 클래스의 경우 (생성자를 통한) 인스턴스의 인스턴스화, 양식로드 및 양식 가시성은 세 가지이며, 동시에 발생해야 할 필요는 없습니다 (분명히 순서대로 수행해야하지만).

4

는 :


를 Form.Load 처음 양식을 표시하기 전에 발생합니다.

양식을로드하는 유일한 원인은 표시 될 때입니다.
Form.Show();Form.Visible = true;은 완전히 똑같습니다. 기본적으로 Show는 다양한 조건을 검사 한 다음 Visible을 true로 설정합니다. 폼을 표시하기 전에 보이지 않게 false로 설정하는 것은 의미가 없습니다.

하지만 기술을 잊어 버리자. Rich B와 Shaun Austin과 완전히 동의합니다. 논리가 어쨌든 그 형식이되어서는 안됩니다.

11

아마도 여기서 이므로 양식을 표시하지 않고 양식의 창을 작성해야합니다. 나는 이것을하기를 원하는 정당한 상황이있을 수 있다고 생각합니다. 이 같은 그렇게 할 수 어쨌든

, 좋은 디자인 여부 :

내가 호출 할이의 Form_Load()을 일으킬 것이라고 생각하지 않지만, 당신이 f.Invoke를 호출 할 수
MyForm f = new MyForm(); 
IntPtr dummy = f.Handle; // forces the form Control to be created 

()이 시점에서 (나는이 질문을 우연히 만났을 때 내가하려고했던 일이다).

+0

이 답변은 나에게 많은 도움이되었습니다. – Kelsie

+0

한 가지 이유는 서비스처럼 앱을 계속 실행하는 것입니다. –

1

때로는 이것이 잘못된 디자인이 아니면 유용 할 때도 있습니다. 때로는 네이티브에서 관리로 마이그레이션하는 시작일 수 있습니다.

예를 들어 C++ 응용 프로그램을 .NET으로 마이그레이션하는 경우 yourwhole 응용 프로그램을 .NET 양식 또는 패널의 하위 창으로 만들고 C++ 응용 프로그램 메뉴를 제거하여 점차 .NET으로 마이그레이션 할 수 있습니다 , 상태 표시 줄, 도구 모음 및 매핑 등을 포함 할 수 있습니다. 플랫폼 호출 등을 사용하여 앱에 대한 정보를 가져 오지 마십시오.

C++ 앱을로드하는 데 시간이 오래 걸릴 수 있지만 .NET 양식이 좋지 않을 수 있습니다. C++ 응용 프로그램이 초기화 될 때까지 .NEt 양식을 숨 깁니다.

show를 호출 한 후 opacity = 0 및 visible = false를 false로 설정하고 C++ 응용 프로그램이로드 된 다음 되돌릴 때 false로 설정했습니다.

관련 문제