1

デバッグ用のコンソールを起動できる Windows フォーム アプリがあります。アプリでは、メニューをクリックして、CSV ファイルを読み取り、コンソールに書き込みます。これを行う関数は以下です。

    protected void menuRead_Click(object sender, EventArgs e)
    {
        // ... functionality to load CSV files
        System.IO.Stream inputDataFile = null;
        OpenFileDialog fd = new OpenFileDialog();
        fd.InitialDirectory = "c:\\";
        fd.Filter = "csv files (*.csv)|*.csv|All files (*.*)|*.*";
        fd.FilterIndex = 1;
        fd.RestoreDirectory = true;
        if (fd.ShowDialog() == DialogResult.OK)
        {
            try
            {
                if ((inputDataFile = fd.OpenFile()) != null)
                {
                    inputData_exists = true;
                    // ... read input data from CSV file
                    using (CsvFileReader reader = new CsvFileReader(inputDataFile))
                    {
                        CsvRow row = new CsvRow();
                        while (reader.ReadRow(row))
                        {
                            foreach (string s in row)
                            {
                                Console.Write(s);
                                Console.Write(" ");
                            }
                            Console.WriteLine();
                        }

                        // ... close the input data stream
                        inputDataFile.Close();
                    }
                }
            }
            catch (Exception err)
            {
                //Inform the user if can't read the file
                MessageBox.Show(err.Message);
            }
        }
    }

以下を除いてすべて正常に動作します: csv ファイルには約 1200 行のコードがあります。このコードを実行すると、csv ファイルの内容がコンソール ウィンドウに書き込まれ始める前に、OpenFileDialog() ウィンドウが部分的にしか閉じません。そのため、データがコンソール ウィンドウに書き込まれていることがわかります。また、ダイアログ ウィンドウの小さな長方形の部分がフォームに表示されています。データがコンソールに書き込まれる前にダイアログを確実に閉じる方法はありますか? コンソールと通信するには、新しいスレッドを開く必要がありますか? どんなアドバイスや助けも大歓迎です。ありがとうございました。

4

3 に答える 3

0

あなたの問題は、コンソールとShowDialog呼び出しを表示するという事実に起因しています。ダイアログの結果を取得し、コンソール アプリケーションを開きます。別のスレッドでファイルを読むこともできます。

于 2011-11-18T18:16:00.190 に答える
0

ここでは多くのアプローチを使用できます。最も単純なもの: StringBuilder を使用し、すべてのデータを一度に配置します。コンソールへの出力が非常に遅くなる可能性があるためです。

StringBuilder consoleBuffer = new StringBuilder();
using (CsvFileReader reader = new CsvFileReader(inputDataFile))
{
    CsvRow row = new CsvRow();
    while (reader.ReadRow(row))
    {
        foreach (string s in row)
        {
            consoleBuffer.Append(s);
            consoleBuffer.Append(" ");
        }
        consoleBuffer.Append(Environment.NewLine);
    }

    Console.WriteLine(consoleBuffer.ToString());

    // ... close the input data stream
    inputDataFile.Close();
}
于 2011-11-18T18:16:10.440 に答える
0

コントロールの破棄中にコントロール「OpenFileDialog」が再描画されるまで、少し時間を与える必要があります。WinForm の最も簡単な方法は、Application.DoEvents() を使用することです。

if (fd.ShowDialog() == DialogResult.OK)
{      
    Application.DoEvents();
    ...
    ...
}
于 2011-11-18T18:20:49.413 に答える