tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDialogResult設定時でも勝手にcloseしない方法
記事No1639
投稿日: 2005/04/27(Wed) 10:37
投稿者はせどん
[OSのVer]:Windows XP   [VBのVer]:VB.NET   2003

サブ画面でDialogResult.OKを使用してもサブプロシージャー内でキャンセルする方法を
教えて下さい。
(例)

    Private Sub cmdOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles cmdOk.Click

        If MessageBox.Show("Closeしますか?", "Which", MessageBoxButton
s.OKCancel,
MessageBoxIcon.Exclamation) = DialogResult.OK Then
            Me.Close()
        Else
            ' Closeしたくないのに勝手にClose処理がされてしまう。
        End If

    End Sub

HPで探すと下記のような記事があるのですが。。。

<hhttp://www.microsoft.com/japan/msdn/vbasic/migration/tips/dialogbox.aspx>
、「OK」ボタンに[OK]という役割を、「キャンセル」ボタンに[Cancel]という役割を設定します

上記のコード(リスト2)を実装すると、Close() メソッドを呼び出していないのに、Form2 の「OK」
または「キャンセル」ボタンが押されると、Form2 が閉じてしまいます。これは、DialogResult プロ
パティの仕様によるものです。そのため、DialogResult プロパティを使用する場合、DialogResult

ロパティを設定したボタンは Close() メソッドを呼ばなくても閉じてしまうことに注意してくださ
い。

[ツリー表示へ]
タイトルRe: DialogResult設定時でも勝手にcloseしない方法
記事No1640
投稿日: 2005/04/27(Wed) 10:47
投稿者るしぇ
        Me.DialogResult = DialogResult.None
…かな?
↓ヘルプにも載ってますが。
hhttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbtsksettingdialogresultfordialogbox.asp

[ツリー表示へ]
タイトル大変ありがとうございます。だけど不思議。。。
記事No1642
投稿日: 2005/04/27(Wed) 11:11
投稿者はせどん
[OSのVer]:Windows    [VBのVer]:VB.NET  
>         Me.DialogResult = DialogResult.None
> …かな?
大変早いレスポンスありがとうございます。

下記のように変更したところCLOSEしなくなりました。
多少違和感(Cancel処理でないところが)を感じますが実現できました。
しかし、一度Me.DialogResult = DialogResult.Noneをセットした後に、
Me.DialogResult = DialogResult.Okをしなくても親PGでOkが取得できるのはなぜでしょうか?
DialogResult.NoneはCancel処理であるが、以前のDialogResult.Okを覚えているということでしょうか


    Private Sub cmdOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles cmdOk.Click

        If MessageBox.Show("Closeしますか?", "Which", MessageBoxButtons.
OKCancel,
MessageBoxIcon.Exclamation) = DialogResult.OK Then
            'Me.DialogResult = DialogResult.OK
            Me.Close()
        Else
            ' Closeしたくないのに勝手にClose処理がされてしまう。
            Me.DialogResult = DialogResult.None ← 追加
        End If

    End Sub

[ツリー表示へ]
タイトルRe: 大変ありがとうございます。だけど不思議。。。
記事No1643
投稿日: 2005/04/27(Wed) 11:48
投稿者魔界の仮面弁士
> しかし、一度Me.DialogResult = DialogResult.Noneをセットした後に、
> Me.DialogResult = DialogResult.Okをしなくても親PGでOkが取得できるのはなぜでしょうか?

何が返されるかは、そのボタンのDialogResultプロパティの設定次第でしょう。

なお、ボタンのDialogResultプロパティが None 以外に設定されているなら、
クリックイベントに Me.Close() を書く必要はないかと。(自動的に閉じられます)

[ツリー表示へ]
タイトルRe: 大変ありがとうございます。だけど不思議。。。
記事No1645
投稿日: 2005/04/27(Wed) 12:19
投稿者るしぇ
>多少違和感(Cancel処理でないところが)を感じますが実現できました。
せっかくヘルプのリンクを貼ったのですから、もう少し読まれてはどうですか?
レスの1行だけ参考にせず、ヘルプも読んでれば魔界の仮面弁士さんの指摘の
ような事はなかったと思います。
[リンク先より抜粋]
>メモ   フォームの Closing イベントを使用して、ダイアログ ボックスを閉じるのを中止することもできます。
↑から Form.Closing イベントにリンク。
お望みの Cancel 処理も書いてあります。ただし、
[Form.Closing イベントより抜粋]
>イベント ハンドラに渡される CancelEventArgs の Cancel プロパティを true に設定します。
イベントハンドラという事で確かに違いはありますが、 Cancel 処理も
プロパティを設定しているだけです。Cancel プロパティはキャンセルするか
どうかの2値で可能なのに対し、DialogResult プロパティは、どんな結果か?
複数の意味を持たせるために Boolean で無いだけです。ボクには全くもって
共通した概念に思えますが?。

>しかし、一度Me.DialogResult = DialogResult.Noneをセットした後に、
>Me.DialogResult = DialogResult.Okをしなくても親PGでOkが取得できるのはなぜでしょうか?
テストの仕方(or コード)が悪いだけでしょう。こちらでもテストしましたが、
None をセットすればちゃんと None で取得できました。…ただのプロパティ
ですから当然のことです。

[ツリー表示へ]
タイトルありがとうございました。
記事No1646
投稿日: 2005/04/27(Wed) 13:16
投稿者はせどん
[OSのVer]:Windows    [VBのVer]:VB.NET  

るしぇさん、魔界の仮面弁士 さん回答ありがとうございました。

PGでうまくいかない件は、下記のような私の認識違いでした。
Me.DialogResult = DialogResult.NoneをButton1.DialogResult = DialogResult.None
と勘違いしておりました。

[ツリー表示へ]