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 行代码。执行此代码时,OpenFileDialog() 窗口仅在 csv 文件内容开始写入控制台窗口之前部分关闭。因此,我可以看到写入控制台窗口的数据,并且我的表单上显示了对话窗口的一个小矩形部分。有什么方法可以确保在将数据写入控制台之前关闭对话框?我应该打开一个新线程来与控制台通信吗?任何建议或帮助将不胜感激。谢谢你。

4

3 回答 3

0

您的问题来自您显示控制台和ShowDialog调用的事实。获取Dialog的结果,然后打开您的控制台应用程序。我想您也可以在另一个线程上阅读该文件。

于 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 回答