2008-09-15 17 views
9

ショートバージョン:フォームを表示させずにForm_Load()イベントをトリガーします。フォームを表示せずにロードする

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

ロングバージョン:メインとタスク:私は2つのフォームでのWinFormsアプリケーションがあります。ショーは、()Visibleプロパティの現在の値を無視するので、これは動作しません。メインフォームは常に表示されます。ユーザーはボタンをクリックしてタスクフォームを開くか、タスクフォームを開かずに直接タスクを実行するボタンをクリックすることができます。

ユーザがタスクを直接実行するように要求された場合、タスクフォームでパブリックメソッドを表示せずに呼び出すだけです。残念ながら、タスクロジックはForm_Load()イベントで発生するものに依存します。 Form_Load()をトリガーするために私が見つけることができる唯一の方法は、Show()を呼び出すことです。私が行うことができました最高のは、最小化した状態でフォームを表示することです:

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

私はきれいな解決策は、タスクのフォームから出て、コントローラクラスにタスク・ロジックを引っ張ることであろうと仮定します。それから私はメインフォームとタスクフォームからそのクラスを使用して、ユーザーの目に見えるようにタスクフォームをロードするだけです。しかし、フォームを表示せずにフォームをロードするのは簡単なことですが、それは小さな変更になります。

+0

私はあなたが一番きれいなソリューションをお勧めします。後で維持する方が簡単になります。 –

+0

私は私の答えで言ったように、私はScottと同意しているので、これを再加工してコントローラクラスのルートに行く必要があります。それは良い習慣です。 –

答えて

7

私はRich Bに完全に同意しています.WindFormsの仕組みを掘り下げるのではなく、アプリケーションロジックを配置する場所を調べる必要があります。あなたのタスクフォームが公開されているすべての操作とデータは、実際に別のクラスに入っている必要がありますが、必要に応じてデータを読み込んで表示するために、インスタンス化されるフォームが存在する必要があります。

それはおそらくあなたがアプリの構造を改善し、MSDN等から、それはより保守

+1

*一口*大丈夫、いいよ。みなさん、フィードバックいただきありがとうございます。 –

9

あなたが座ってここであなたのアプローチを再考する必要があるように私に聞こえる。あなたが公開しようとしていない場合、パブリックメソッドをフォームにする必要があるという単一の理由は想像もできません。ちょうど新しいクラスを作る。

+0

あなたのポイントを外挿するには、TaskのModelクラスと、TaskFormであるView/Controllerクラスを用意します。 – user7116

+0

@sixlettervariables:なぜ彼はビューを必要としますか?とにかく彼は彼がフォームをロードするつもりはないと言いました。彼はちょうどクラスが必要なように聞こえる。 – GEOCHET

+0

私は彼がデータを見ようとしていない部分を見逃しました。それが唯一の質問であれば、初心者ではない質問の種類... – user7116

0

メソッドをパブリックにすると、直接アクセスすることができますが、呼び出すと予期しない副作用が発生する可能性があります。しかし、公開して直接呼び出すと、画面が描画されたり、フォームが開かれたりすることはありません。

0

Loadイベントハンドラからフォームクラスの必須初期化コードをコンストラクタに移動します。 Formクラスの場合、(コンストラクタによる)インスタンスのインスタンス化、フォームの読み込みとフォームの可視性は3つの異なるものであり、同時に実行する必要はありません(明らかにその順序で行う必要があります)。

4

を作ることになります、それを手直しするために痛みをようだが、:

Form.Load
フォームが初めて表示される前に発生します。

フォームをロードする原因となるのは、表示されるときだけです。
Form.Show();Form.Visible = true;はまったく同じものです。基本的には、Showはさまざまな条件をチェックし、Visibleをtrueに設定します。明らかに、フォームを表示する前に、すでに表示されているfalseをfalseに設定することは無意味です。

しかし、技術を忘れてみましょう。私はRich BとShaun Austinに完全に同意します - 論理はとにかくその形になるべきではありません。

11

であり、フォームを表示せずにフォームのウィンドウを作成することに注意してください。私はこれをやりたいと思う正当な状況があると思う。

MyForm f = new MyForm(); 
IntPtr dummy = f.Handle; // forces the form Control to be created 

私は、これはのForm_Load()が呼び出されることになりますとは思わないが、あなたはf.Invokeを呼び出すことができるようになります:とにかく

、良いデザインかどうか、あなたはこのようにそれを行うことができますこの時点で(これは私がこの質問に遭遇したときにやろうとしていたものです)。

+0

この回答は私を大いに助けました。 – Kelsie

+0

1つの理由は、サービスのようにアプリを稼働させ続けることです –

1

時には、これは設計が間違っていなければ便利です。場合によっては、ネイティブから管理対象への移行が始まる可能性があります。

たとえば、C++アプリケーションを.NETに移行する場合は、yourwholeアプリケーションを.NETフォームまたはパネルの子ウィンドウにして、徐々にC++アプリケーションメニューを削除して.NETに移行することができます、ステータスバー、ツールバー、マッピングなどのアプリケーションにプラットフォーム呼び出しなどを使用します。

C++アプリケーションの読み込みに時間がかかることがありますが、.NETフォームはお勧めできませんC++アプリケーションが初期化されるまで.NEtフォームを非表示にする。

showを呼び出した後、opacity = 0とvisible = falseをfalseに設定しました。その後、C++アプリケーションが読み込まれてから逆になります。

関連する問題