2011-11-18 4 views
1

디버그 용 콘솔을 시작할 수있는 Windows Forms 앱이 있습니다. 앱에서 메뉴를 클릭하면 CSV 파일을 읽고 콘솔에 씁니다. 이 작업을 수행하는 함수는 다음과 같습니다.C# : Windows App 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 파일 내용이 콘솔 창에 기록되기 시작합니다. 그래서 콘솔 창에 데이터를 쓰는 것을 볼 수 있습니다. 대화 상자 창에 작은 사각형 부분이 있습니다. 데이터가 콘솔에 기록되기 전에 대화 상자를 닫을 수있는 방법이 있습니까? 콘솔과 통신하기 위해 새 스레드를 열어야합니까? 어떤 조언이나 도움 woulf 크게 감상 할 수 있습니다. 고맙습니다.

답변

0

당신은 컨트롤의 처분 동안 자체를 다시 칠하는 컨트롤 "OpenFileDialog를"약간의 시간을 줄 필요가,의 WinForm을위한 가장 쉬운 방법은 Application.DoEvents()

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

이렇게하면 각 행을 읽은 후 강제로 다시 칠합니다. 이것은 자원 낭비와 같지만 정보를위한 행크스처럼 보인다. – Zeos6

+0

어쩌면 시도해 볼 수 있습니다 fd.Invalidate(); –

+0

@ Zeos6 : 아니요. 읽기 루프가 그 아래에서 시작됩니다. – ChrisWue

0

콘솔을 표시하고 ShowDialog 전화를 걸면 문제가 발생합니다. 결과를 얻으십시오 대화 다음 콘솔 응용 프로그램을 엽니 다. 내가 생각하는 다른 스레드에서 파일을 읽을 수도 있습니다.

+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