C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: ShowDialogでのErrorについてお教え下さい


(過去ログ 96 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■57208 / inTopicNo.1)  ShowDialogでのErrorについてお教え下さい
  
□投稿者/ ミネ (3回)-(2011/02/17(Thu) 12:44:55)
ミネ さんの Web サイト

分類:[.NET 全般] 

VisualStudio2005(VB)でProgramを作成しています。 
DFile(DataFile)幾つかを作成しそのデータをfrmDataRW.showdialogで呼び出して
利用しています。 
DFileを変更したい場合はfrmDataRWにはcmdDFileChangeがありこれをClickすれば 
frmDataRW.Hideの後にfrmDFileSeltがshowdialogされここでDFileが変更出来ます。

    frmDataRW:
    '*************************************************************************************
    '   Sub cmdDFileChange_Click
    ' データファイル変更が入力されたら
    '*************************************************************************************
    Private Sub cmdDFileChange_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdDFileChange.Click
        flgDFileChange = True
        Me.Hide 
        frmDFileSet.ShowDialog()
    End Sub
  
  frmDFileSelt:
      OptionButtonでどのDFileを使うかを指定しています。
   例えば
     Case 3 '(OptionButton 3)
                'サンプルデータファイルの使用
                DFile = stCurrentDir & "\DataFile\SD_Sample.dat"
                lblDataFileName.Text = DFile
                frmDataRW.lblDataFileName.Text = DFile
                Me.Hide()        'AAA
                Try
                    frmDataRW.ShowDialog()    'BBB
                Catch ex As Exception
                    MsgBox(ex.Message)      'CCC
                End Try
この変更後にFrmDFileSelect.Hideし('AAA)再度このDFileでfrmDataRW.showdialog('BBB)しようとしますと
('CCC)で「System.InvalidOperationException' の初回例外が System.Windows.Forms.dll で発生しました。」
「既に表示されているフォームをモーダル ダイアログ ボックスとして表示できません。
showDialog を呼び出す前に、フォームの Visible プロパティを false にしてください」
とErrorになります。
一旦frmDataRW.Hideとしているのになぜこの様なErrorになるのでしょうか?
何方か解決方法をお教え下さい。 よろしくお願い申し上げます。

引用返信 編集キー/
■57209 / inTopicNo.2)  Re[1]: ShowDialogでのErrorについてお教え下さい
□投稿者/ じゃんぬねっと (41回)-(2011/02/17(Thu) 12:56:10)
じゃんぬねっと さんの Web サイト
No57208 (ミネ さん) に返信
> 一旦frmDataRW.Hideとしているのになぜこの様なErrorになるのでしょうか?
> 何方か解決方法をお教え下さい。 よろしくお願い申し上げます。

ダイアログだからとしか表現しようがありません。
frmDataRW が非表示となって残っているなら ShowDialog メソッドを使わずに表示すれば良いと思いますが、
frmDataRW は毎回 Close して毎回作成した方がフツーかなぁと。

Using frmDataRW As New frmDataRW()
  frmDataRW.ShowDialog()
End Using
引用返信 編集キー/
■57210 / inTopicNo.3)  Re[1]: ShowDialogでのErrorについてお教え下さい
□投稿者/ shu (451回)-(2011/02/17(Thu) 13:00:11)
No57208 (ミネ さん) に返信

Formのownerを変更してShowDialogをすることは出来ません。
ShowDialogを最初に行ったところからShowDialogするかDisposeして破棄するか
しないといけないです。
引用返信 編集キー/
■57211 / inTopicNo.4)  Re[2]: ShowDialogでのErrorについてお教え下さい
□投稿者/ マサヤ (262回)-(2011/02/17(Thu) 13:03:57)
HideしたらShowできるのでは、ということだと思いますが、Closeでいいのではないでしょうか?
そして開くときはまたFormのインスタンスを生成して下さい。
CloseしないでHideで隠す意味はないのですよね?
引用返信 編集キー/
■57213 / inTopicNo.5)  Re[1]: ShowDialogでのErrorについてお教え下さい
□投稿者/ 魔界の仮面弁士 (2069回)-(2011/02/17(Thu) 13:49:14)
'メインフォーム
Private Sub …
 frmDFileSet.ShowDialog()  'Show でも可
End Sub

'frmDataRW
Private Sub …              '1
 Me.Hide()                 '2
 frmDFileSet.ShowDialog()  '3   frmDFileSet が閉じるまで待機
End Sub                     '4

'frmDFileSelt
Private Sub …              '5
 Me.Hide()                 '6
 frmDataRW.ShowDialog()    '7   frmDataRW が閉じるまで待機
End Sub                     '8


これらの処理において、4 の行に到達するタイミングというのは、
6 が実行された後ではなく、8 が実行された後です。

また、8 の行に到達するタイミングというのは、
2 が実行された後ではなく、4 が実行された後です。

結局、互いが互いを待ち合わせている状態のままなので、この状態では
4 や 8 には到達しません(Hide を Close にしても同様です)。
ゆえにフォームが消えても、まだモーダル状態として管理されたままとなります。

4 や 8 の箇所にブレークポイントを貼って、テストしてみてください。


> なぜこの様なErrorになるのでしょうか?
Timer などを使って、Hide を呼び出したメソッドの実行が終わった後で
ShowDialog するようにすれば一応は回避できますが、そもそもは
画面遷移の制御構造を見直すべきかと思いますよ。

frmDataRW / frmDFileSelt を排他的に ShowDialog すること自体は
構わないと思いますが、それを ShowDialog を互いに呼びあう形で
実装してしまうと、今回のような問題に見舞われる事になります。


そもそも、ShowDialog (≠Show) で呼び出したフォームというのは、
最後に Dispose メソッドで破棄する必要があります。しかし今回のように
互いを呼び出すようなコードにしてしまうと、いつ Dispose すれば良いのか
管理しにくくなってしまいますよね。


> frmDataRW.lblDataFileName.Text = DFile
他のフォームのコントロールを直接操作しようとするのではなく、
データ受け渡し用のメンバーを用意するようにした方が良いですよ。

引用返信 編集キー/
■57215 / inTopicNo.6)  Re[2]: ShowDialogでのErrorについてお教え下さい
□投稿者/ ミネ (4回)-(2011/02/17(Thu) 14:21:54)
ミネ さんの Web サイト
No57210 (shu さん) に返信
> ■No57208 (ミネ さん) に返信
>
> Formのownerを変更してShowDialogをすることは出来ません。
> ShowDialogを最初に行ったところからShowDialogするかDisposeして破棄するか
> しないといけないです。

早速多数の方から御指導有り難う御座いました。
sueさんのご指導に従い
Sub cmdDFileChange_Clickの me.Hide を
me.dispose に替えるだけで解決しました。
me.Closeはなめしてみたがダメでした。
me.disposeで解決出来ることが判り本当に助かりました。
ご指導頂いた皆様に心から御礼申し上げます。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -