c#でWindowsアプリを作っています。


ファイルのアップロードを作る際に、メイン画面のフォームから子画面を出して「お待ち下さい・・・」みたいな情報を出して、アップロード完了次第、子画面を閉じようとしています。

こんな感じのコードです。

//親画面のフォーム
private void hoge_Click(object sender) {
Child c = new Child();
c.showDialog();
this.uploadFile();
}

ですが、showDialog()をやってしまうと、uploadFile()が全く実行されません。c.showDialog()がモーダルなので、こいつがCloseかDisposeされるまで同期を取るためかと思います。

別に子画面のLoadでuploadFile()を実行すればいいじゃないという話もであるのですが、今後の為にも、親画面から子画面をshowDialog()をさせたあとに、任意の親画面のメソッドを続けて実行させたい場合、どのようにするのがセオリーなのでしょうか?

よろしくお願い致します。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/08/29 16:07:56
  • 終了:2011/09/03 09:49:07

ベストアンサー

id:a-kuma3 No.1

a-kuma3回答回数4524ベストアンサー獲得回数18802011/08/29 16:36:44

ポイント35pt

親画面から子画面をshowDialog()をさせたあとに、任意の親画面のメソッドを続けて実行させたい

ShowDialog() ではなく、Show() を使う。


--

(追記)

「今後の為に...」求めていることと合致しているかどうか分かりませんが、

ダイアログから、親画面のクラスが持っているメソッドを呼び出す、という方法は、割とよくやります。

子画面(ダイアログ)が親画面の処理内容を知らなくても良いので、子画面の部品化ができます。


以下のリンク先では、さらに BackgroundWorker を介することで、子画面の表示処理と、

親画面の処理の非同期で動作するようにしています。

BackgroundWorkerクラスを使用して進行状況ダイアログを作成する

時間のかかる処理の進行状況を表示する

id:gothedistance

ありがとうございます。

BackGroundWorkerクラスが知りたい情報でした。

2011/09/03 09:46:18

その他の回答(3件)

id:a-kuma3 No.1

a-kuma3回答回数4524ベストアンサー獲得回数18802011/08/29 16:36:44ここでベストアンサー

ポイント35pt

親画面から子画面をshowDialog()をさせたあとに、任意の親画面のメソッドを続けて実行させたい

ShowDialog() ではなく、Show() を使う。


--

(追記)

「今後の為に...」求めていることと合致しているかどうか分かりませんが、

ダイアログから、親画面のクラスが持っているメソッドを呼び出す、という方法は、割とよくやります。

子画面(ダイアログ)が親画面の処理内容を知らなくても良いので、子画面の部品化ができます。


以下のリンク先では、さらに BackgroundWorker を介することで、子画面の表示処理と、

親画面の処理の非同期で動作するようにしています。

BackgroundWorkerクラスを使用して進行状況ダイアログを作成する

時間のかかる処理の進行状況を表示する

id:gothedistance

ありがとうございます。

BackGroundWorkerクラスが知りたい情報でした。

2011/09/03 09:46:18
id:Jupiter2100 No.2

じゅぴたー回答回数444ベストアンサー獲得回数742011/08/29 17:11:13

ポイント25pt

モードレス・ダイアログとしてオープンすればいいでしょう。

Form f= new Form();
f.Show();

Windows フォームをモーダルおよびモードレスで表示する

id:gothedistance

ありがとうございます。もうちょい、API読み込みます・・・・。

2011/09/03 09:46:39
id:SweetSmile1978 No.3

SweetSmile1978回答回数191ベストアンサー獲得回数292011/08/30 10:10:13

ポイント10pt

アップロードする処理は新たにスレッドを作成し、

そちらで処理を行わせるようにします。

id:gothedistance

ありがとうございます。

そのスレッドの作成のお作法がわからなくて、質問させて貰いました><

2011/09/03 09:47:07
id:freemann No.4

freemann回答回数307ベストアンサー獲得回数492011/08/30 14:02:03

ポイント30pt

Form.Showを使うのであれば、オーナーフォームを使用するといいかと思います。

その時にオーナーフォームのEnabledをfalseに設定しておけば、操作ができなくなるのでポイントとなります。

        private void btnOpen_Click(object sender, EventArgs e)
        {
            this.Enabled = false;
            Form2 frm = new Form2();
            frm.Show(this);
        }


        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.Owner.Enabled = true;
        }

id:gothedistance

Enabled=falseは盲点でした!ありがとうございます!

2011/09/03 09:47:38

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません