2011-11-18 43 views
1

我有一个Windows Forms应用程序能够启动调试控制台。在应用程序中,通过点击菜单,我读取一个CSV文件并将其写入控制台。这个功能在下面。C#: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文件内容开始写入控制台窗口之前部分关闭。所以,我可以看到写入到控制台窗口的数据,并且我的窗体上显示了一个对话窗口的小矩形部分。在数据写入控制台之前,有什么方法可以确保关闭对话框?我应该打开一个新的线程与控制台通信吗?任何意见或帮助将不胜感激。谢谢。

回答

0

你需要给些时间你控制“打开文件对话框”控制的处置过程中重新绘制本身,WinForm的最简单的方法是使用Application.DoEvents()

if (fd.ShowDialog() == DialogResult.OK) 
{  
    Application.DoEvents(); 
    ... 
    ... 
} 
+0

这会在每行读取后强制重绘。这看起来像是资源的浪费,但却隐藏着信息。 – Zeos6

+0

也许你可以尝试fd.Invalidate(); –

+0

@ Zeos6:不,它不会。你的阅读循环从下面开始。 – ChrisWue

0

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

+0

我觉得这会工作,但对我来说这个问题是,我可能并不总是想写入控制台。如果我想将数据写入数组进行绘图,我会遇到同样的问题。我会检查线程的想法,但它似乎是一个矫枉过正的。 – Zeos6

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(); 
} 
+0

感谢您的建议,但它提供了同样的问题。但是,我确实喜欢一笔一笔地写完整行。谢谢。 – Zeos6

相关问题