Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:Windows应用程序读取CSV文件并写入控制台问题_C#_Winforms Interop - Fatal编程技术网

C#:Windows应用程序读取CSV文件并写入控制台问题

C#:Windows应用程序读取CSV文件并写入控制台问题,c#,winforms-interop,C#,Winforms Interop,我有一个Windows窗体应用程序,可以启动控制台进行调试。在应用程序中,通过单击菜单,我读取CSV文件并将其写入控制台。实现这一点的函数如下所示 protected void menuRead_Click(object sender, EventArgs e) { // ... functionality to load CSV files System.IO.Stream inputDataFile = null; OpenFi

我有一个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文件内容开始写入控制台窗口之前部分关闭。因此,我可以看到数据写入控制台窗口,对话框窗口的一个小矩形部分显示在我的窗体上。有没有办法确保在将数据写入控制台之前关闭对话框?我应该打开一个新线程与控制台通信吗?任何建议或帮助都将不胜感激。谢谢。

您的问题来自于您显示控制台和您的ShowDialog呼叫。获取of对话框的结果,然后打开控制台应用程序。我想您也可以在另一个线程上读取该文件。

在这里您可以使用很多方法。 最简单的一个: 使用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();
}

您需要给控件“OpenFileDialog”一些时间,以便在释放控件期间重新绘制自身,WinForm最简单的方法是使用Application.DoEvents()


谢谢你的建议,但它也带来了同样的问题。然而,我确实喜欢一次写一整行。谢谢。我认为这会起作用,但对我来说,问题是我可能并不总是想给控制台写信。如果我想将数据写入一个数组进行打印,我将遇到同样的问题。我将检查线程的想法,但这似乎是一个过度。这将迫使每一行后重新绘制阅读。这看起来像是一堆资源,但是非常想得到这些信息。也许你可以试试fd.Invalidate();你是对的,这个解决方案很有效。然而,我倾向于一个新的线程,因为我可以独立于应用程序的其他部分读取数据。我已经尝试用一个新的线程读取数据,它也很有魅力。
if (fd.ShowDialog() == DialogResult.OK)
{      
    Application.DoEvents();
    ...
    ...
}