Probmkr
@Probmkr (Probmkr)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

C# Windows Forms のダイアログウィンドウをソースコードで閉じる方法

Q&A

Closed

解決したいこと

どうすればシステム側(ソースコード)でダイアログを閉じることができますか?

例)
 今、本の情報を MySQL から検索する機能を作っています。構成は、メニューウィンドウと、検索ウィンドウの二つでできています。そして、メニューウィンドウから検索ウィンドウ(ダイアログウィンドウ)に移動する感じです。

やってみたこと

1.this.DialogResult = DialogResult.Cancel の記述
 これを記述しても閉じませんでした。
2.this.Depose() の記述
 これだとメモリがどんどん減っていきました。
3.this.Close() の記述
 2と同じです。
4.using(){} の記述
 2、3で閉じているため、System.ObjectDisposedException が出ます。

今はどうしてるか

いまはこうしています。

MenuForm.cs
try
{
    using(BooksQueryForm BooksQueryForm = new BooksQueryForm()
    {
        BooksQueryForm.ShowDialog();
    } // ここで ObjectDisposeException が発生
}
catch(ObjectDisposedException ms)
{
    Console.WriteLine(ms.Message);
    // Cannot access a disposed object.
    // Object name: 'BooksQueryForm'.
}
BooksQueryForm.cs
MySqlConnectionStringBuilder conBuider = new MySqlConnectionStringBuilder
{
    UserID = "book_manager",
    Server = "localhost",
    Database = "book_manager",
    Password = "IlikeBoos" // わざと間違ったパスワードにする
};
this.connector = new MySqlConnection(conBuider.ConnectionString);

try
{
    this.connector.Open(); // 失敗する
    this.connector.Close();
}
catch (MySqlException ms)
{
    Console.WriteLine(ms.Message);
    MessageBox.Show("Error\nFaild to connect MySQL.\nThis program will stop.");
    //this.DialogResult = DialogResult.Cancel; // これは閉じない
    //this.Dispose(); // これは ObjectDisposeException が発生する
    this.Close(); // 上と同じ
    return false;
}
return true;

全然解決できないです。知っていたら教えてください。お願いします。

 

0

1Answer

普通に閉じるだけなら this.Close() で問題ないです。
なので、記載していない範囲での問題なのだと思います。

エラー情報(スタックトレース)も出してもらえるとわかるかもしれません。

もしかしたら、ダイアログのコンストラクタ処理中で this.Close() を呼んでいますか?
もし、コンストラクタでダイアログ表示を諦めたい場合には、例外を投げる必要があると思います。
(その場合には、呼び出し元で例外をキャッチして処理する必要があります)

あるいは呼び出し元、つまり MenuForm 側でDBアクセスを実施する方法もあります。
(DBアクセスできないときには、そもそもダイアログを表示しようとしない)

1Like

Comments

  1. @Probmkr

    Questioner

    ご回答ありがとうございます。
    たしかにそうですね。そもそも先に DB 接続テストをしてから呼ぶのが普通ですね。
    ということで、そういう風にしてみます。
    ありがとうございました。

Your answer might help someone💌