2012-02-02 29 views
1

フォーム:は、私は次のような問題を持っている

私は(スタック内の複数のモーダルフォームを開く例えば、Form1が順番にモーダルフォームを開くモーダルフォームのForm2を開きますform3など)。私はスタック全体を隠したいと思っています。

私はHideメソッドを呼び出すか親のVisibleプロパティを設定しようとしましたが、これは親を隠すだけです。私はまた、すべてのフォームを個別に隠してみましたが、上記のメソッドを呼び出すスレッドをロックする各フォームにShowDialogを呼び出さなければなりません。

モーダルダイアログを設定して、最初のフォームにプロパティを設定するだけで、親のステータスを継承し、カスケードで非表示にする方法はありますか?

他の提案もあります。

+4

モーダルダイアログとは、「続行する前に何かしてください」という意味です。モーダルフォームをモーダルフォーム上に置いて、それを隠すだけでは、意図したとおりにモーダルフォームを使用しているわけではありません。あなたのguiインターフェイスを修正することを検討してください。 – LarsTech

+0

残念ながら、GUIを再設計することで問題を回避することは選択肢ではありません。たとえ可能であったとしても、フォームが複雑な機能を持つ場合があるので、現在の設計は有効であると私は思う。したがって、ユーザーの注意を要求するフォームが複雑なロジックを持つ場合、そのフォームをロックして親をロックする必要が生じる可能性があります。さらに、ビジネスプロセスの3つのレベルの深さは、ビジネスアプリケーションにとってはかなり受け入れられるようです。 – Bogdan

答えて

1

obj.Visible = falseを設定して非表示にしたフォームを再度表示するには、ではなく、と設定します。

ShowDialogはメッセージループを開始します。このダイアログは既にメッセージループを実行しているため、混乱を招きます。

1

あなたはモーダルダイアログについて話しているので、このアクションを開始するのは最後のものです。次の例のようにすべてのフォームを開き、最後にHide()を開きます。

public partial class Form1 : Form 
{ 
    Form2 frm2 = new Form2(); 

    public Form1() 
    { 
     InitializeComponent(); 
     frm2.VisibleChanged += frm2_VisibleChanged; 
     Shown += Form1_Shown; 
    } 

    void Form1_Shown(object sender, EventArgs e) 
    { 
     frm2.ShowDialog(); 
    } 

    void frm2_VisibleChanged(object sender, EventArgs e) 
    { 
     if (frm2.Visible == false) Hide(); 
    } 
} 
+0

これは、Hideメソッド呼び出しをカスケードする非常に良い例ですが、私のアプリケーションのアーキテクチャ全体を変更するよりもフォームのリストにVisibleプロパティを設定する方が簡単なので、Benのソリューションが好きです。 – Bogdan

+0

@Bogdan問題ありません。 'ShowDialog'フォームを' Dispose'することを忘れないでください。 (http://msdn.microsoft.com/en-us/library/c7ykbedk.aspxを参照してください) – ispiro

関連する問題