TakuNozwa
@TakuNozwa

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

VC# SaveFileDIalogがフリーズする

特定の条件下で、SaveFileDialogから処理か返ってこずフリーズしてしまいます。

環境
・Windows11 Pro 64bit
・VisualStudio 2022
・C# Windowフォームアプリケーション
・.Net FrameWorks 4

DataGridViewのdgvMonitor の内容をエクセルに出力するため、SaveFileDialogにて
出力するファイルを指定し、そのファイルパスを後段のMessageFrm_EXCELOutput に
渡すだけなのですが、
SaveFileDialogの画面内で既存のエクセルファイルを指定し「保存」をクリックすると、
本来ならば「(ファイル名)は既に存在します。上書きしますか?」のダイアログボックスが
出るはずですが、「ファイル名」欄に表示されたファイル名(例えばtest.xlsx)が
選択された状態になるだけでダイアログボックスは出ず、そのままの画面でフリーズしてしまいます。
ソース内の
 ・return;
 ・path = sfd.FileName;
にブレークポイントを設けていますが、sfd.ShowDialog() から処理が返ってきていないので
ブレークポイントにも引っかかりません。

該当するソースコード

        private void pnlMonitorExcel_Click(object sender, EventArgs e)
        {
            DataGridView source = this.dgvMonitor;

            if (source != null)
            {
                string path;
                using (SaveFileDialog sfd = new SaveFileDialog())
                {
                    sfd.Filter = "Excel File (*.xlsx)|*xlsx";
                    sfd.InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal);
                    sfd.FilterIndex = 0;
                    sfd.Title = global.LangMgr.GetString("MSGTITLE_SETOUTPUTFILENAME");
                    sfd.RestoreDirectory = true;

                    if (sfd.ShowDialog() != DialogResult.OK)
                    {
                        return;
                    }

                    path = sfd.FileName;
                }

                object[] obja = { "", "" };
                obja[0] = this.lblSelId.Text;
                obja[1] = this.lblSelIndex1.Text;
 
                using (MessageFrm_EXCELOutput eo = new MessageFrm_EXCELOutput("MSGTITLE_EXCELOUTPUT", "", path, source, MessageFrm_EXCELOutput.SoueceType.LNMONITOR,obja))
                {
                    eo.ShowDialog();
                }

            }
        }

おかしなことに、保存するソースとなるDataGridViewにデータソースとして設定している
データテーブルの行数が0行の時、この問題は発生しません。
また既存ファイルを指定せず、新規にファイル名を入力した場合も、フリーズは発生しません。

ファイルは特定のファイルではなく、どのエクセルファイルを選択しても同様です。
PC内の全ファイルを試したわけではありませんが、

using (SaveFileDialog sfd = new SaveFileDialog()){
・・・
}

の部分が一字一句同じ関数が他のフォームでも複数個所存在していて、
そちらの処理から問題が発生するファイルを指定し「保存」した場合は、何も問題は発生しません。

そもそもSaveFileDialog自体には、特にDataGridViewの何かを絡めてはいないので、
データ行数で挙動に違いがあるのもよくわからないです。

何か解決の糸口になるような情報はないでしょうか?

1

1Answer

.Net FrameWorks 4

.NET Framework 4 はサポート期限が切れてます。そこが今回の問題ではないかもしれませんが、サポート期限切れのフレームワークで調べてみようという気になる人は多くはないと思います。

問題の切り分けのため、コードをどんどん削って行って (もしくは逆に少しずつコードを増やしていくのもよさそうです)、問題を再現するの非必要最低限のコードだけを提示することはできますか? そうすることによって問題を特定でき、自己解決できることも多いのです。

0Like

Comments

  1. @TakuNozwa
    4.0 としていないところを見るときっと 4.6.2 以上では感あります。あっていますか?

  2. @TakuNozwa

    Questioner

    SurferOnWww様、ご回答有難うございます。
    .Net 4.0を使用しているのは、顧客からの要望であるためどうしようもない部分なのですが、結論からいうと解決できました。
    同じフォーム上に、問題のDataGridViewのソースとなるテーブルを元にしたチャート
    (今回はSeries3つ、すべて StepLine)を表示してるのですが、その表示処理を殺してみるとフリーズしなくなりました。
    SaveFileDIalogを表示する前に Char1.Visible = false; とするだけでも解決するため、チャートは表示しているだけでそのスレッドに大きな負荷をかけているという事なのでしょうか。
    とりあえず関数の頭でVisibleをFalseに、finally で True にする処理を追加してフリーズを回避しようと思います。
    アドバイス有難うございました。

    juner様 コメントありがとうございます。
    .Netは4.0です。
    実際にVisualStudioの対象フレームワーク欄の表記が .NET Frameworks 4 となって
    いるのでそう書いたのですが、確かに正確に伝わらないですね。
    以後気を付けたいと思います。

Your answer might help someone💌