DOBON.NET DOBON.NETプログラミング掲示板過去ログ

呼び出し画面のみ制御できないようにする。

環境/言語:[VB2008 win7 ]
分類:[.NET]

お世話になります。

フォームAに6つボタンがあり、そのうちの一つから呼び出される画面をBとします。
Bから子画面Cをモーダルで表示します。

その際にフォームAやAから呼び出される他の5画面は操作できるようにしたいのですが、そのようなことは可能なのでしょうか?
2013/06/09(Sun) 17:48:33 編集(投稿者)

■No31633に返信(こーきさんの記事)
> Bから子画面Cをモーダルで表示します。
> その際にフォームAやAから呼び出される他の5画面は操作できるようにしたい

(1) A には Button1〜Button5 があり、それぞれが B1〜B5 画面を開いている。
(2) そのうちの B1 からは、画面 C がモーダルで呼ばれている。
(3) 画面 C から呼出元(B1)を操作させたくないが、B2〜B5 および A は操作させたい。

という状態でしょうか?
だとしたら、(2) をモードレスに変更するべきです。


現状はおそらく、(2) の部分が

Partial Public Class FormB1

 Private Sub ButtonX_Click(…) Handles ButtonX.Click
  事前処理()
  Using dialog As New FormC()
   Dim result = dialog.ShowDialog(Me)
   If result = DialogResult.OK Then
    MsgBox("OK")
   Else
    Return
   End If
  End Using
  事後処理()
 End Sub

End Class


のようになっているかと思いますが、それを下記のように変更します。


Partial Public Class FormB1

 Private WithEvents dialogC As FormC = Nothing

 Private Sub ButtonX_Click(…) Handles ButtonX.Click
  ButtonX.Enabled = False
  If dialogC IsNot Nothing Then
   Return
  End If
  事前処理()
  dialogC = New FormC()

  Me.Enabled = False  '←モーダルの代用
  'FormB1 の Enabled 状態は、FormB1 が自分自身で切り替えますので、
  'FormC 側では、どの画面から呼びだされたのかを管理する必要はありません。

  dialogC.Show(Me) 'ShowDialog の代わりに Show を呼び出します。
  'Show した後は特に何もせず、直ちにイベント処理を抜けるようにします。
 End Sub

 Private Sub dialogC_FormClosed(ByVal sender As Object, ByVale As FormClosedEventArgs) Handls dialogC.FormClosed
  'ダイアログが閉じられた後の事後処理が必要な場合は、ここに記述します。
  If dialogC.DialogResult = DialogResult.OK Then
   MsgBox("OK")
   事後処理()
  End If
  dialogC = Nothing
  Me.Enabled = True
  ButtonX.Enabled = True
 End Sub

End Class


なお、モーダル画面の場合には、ShowDialog メソッドの戻り値を使うために
 ・ダイアログの AcceptButton プロパティ
 ・ダイアログの CancelButton プロパティ
 ・ダイアログ上のボタンの DialogResult プロパティ
などを利用できましたが、モードレスにするとこれらは動作しなくなりますので
改修する際には注意してください。

もしも上記サンプルのように、戻り値として DialogResult を
利用していたのであれば、FormC をモードレスに変更するにあたり、
戻り値となる Me.DialogResult プロパティの操作などを
明示的に実装する必要があります。たとえばこんな感じで。

Partial Public Class FormC

 Private Sub ButtonOK_Click(…) Handles ButtonOK.Click
  Me.DialogResult = ButtonOK.DialogResult
  Me.Close()
 End Sub

 Private Sub ButtonCancel_Click(…) Handles ButtonCancel.Click
  Me.DialogResult = ButtonCancel.DialogResult
  Me.Close()
 End Sub

 Private Sub FormC_FormClosing(…) Handles Me.FormClosing
  If Me.DialogResult = System.Windows.Forms.DialogResult.None Then
   'OK/Cancelボタン以外から閉じられた場合(右上×ボタンなど)の
   '既定の戻り値をセット
   Me.DialogResult = System.Windows.Forms.DialogResult.OK
  End If
 End Sub

End Class
魔界の仮面弁士さんありがとうございました!

Enableプロパティの使用は盲点でした。
無事に希望の動作を満たすことができました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板