2017-06-16 74 views
2

我是使用System.IO的新手。向用戶顯示文件無法加載到程序的消息c#

我有一個應用程序從Web抓取Json文件,只抓取部分數據以顯示在Windows應用程序窗體的控件上。 表單允許用戶將數據保存爲新文件並加載文件,只要它包含我在保存文件時添加的「指示器」,該文件告訴程序它已被我的程序保存。

一切正常。

只要不包含該指示器的文件被加載到程序中,它就不會顯示任何內容,這是我希望它執行的操作,但我也希望Messagebox.Show()彈出並讓其用戶知道爲什麼這些值是空的,爲什麼沒有發生。

if(openFile.ShowDialog() == DialogResult.OK) 
{ 
    string dataLine = string.Empty; 
    using (StreamReader read = new StreamReader(File.OpenRead(openFile.FileName))) 
    { 

     dataLine = read.ReadToEnd(); 
     string[] beginningOfData = dataLine.Split(','); 
     string temporary = string.Empty; 
     foreach (string line in beginningOfData) 
     { 
      //Indicator 
      if(line.Contains("Indicator") 
      { 
       temporary = line.substring(9); 
       //Goes through the rest of the file 
       //Converts data to control value and adds it 
      } 
      else 
      { 
       //Where I tried to display the message box  
      } 
     } 
    } 

} 

這是我已經試過,但它不工作,因爲我想它也

else 
{ 
    MessageBox.Show("Can't load data.");  
} 

它仍然會顯示在MessageBox即使閱讀該指標在那裏,顯示相應控件內的數據。另外,無論何時我試圖關閉MessageBox,它都會再次顯示它。

所以我決定這個代替:

else if(!line.contains("Indicator")) 
{ 
    MessageBox.Show("Can't load data."); 
    break; 
} 

,並也以此方式:

else 
{ 
    if(!line.contains("Indicator")) 
    { 
     MessageBox.Show("Can't load data."); 
     break; 
    } 
} 

我也試圖使之更加具體做

if(line.contains("Indicator") == false) 
{ 
    //Code here 
} 

但它會即使該文件是由程序創建的,仍然會顯示它。

休息;確實阻止了消息框再次出現,但我只希望MessageBox顯示它是不正確的文本文件(不包含指示符),並允許我關閉MessageBox以再次嘗試。

+0

你想要的文件包含一條線,你必須取值爲Indicator'還是要跨越從文件中的所有行只是一個單一的'Indicator'價值? – Deadzone

+0

第一個。 當我打開已創建它的顯示,如文本文件: (只是一個例子) 指標,內容:1,數據2:字, – BeginnerCoder

+0

這被認爲是一個有效的文件: 線路1:「SomeText」則會 2號線:「Indicator」 ... – Deadzone

回答

0

我這樣做,而不是和它的工作對我的應用程序

if(openFile.ShowDialog() == DialogResult.OK) 
{ 
    string dataLine = string.Empty; 
    using (StreamReader read = new StreamReader(File.OpenRead(openFile.FileName))) 
    { 
     //Changed happened here 

     dataLine = read.ReadToEnd(); 
     string[] beginningOfData = dataLine.Split(','); 
     string temporary = string.Empty; 

     if(beginningOfData.Contains("Indicator")) 
     { 
      temporary = dataLine.Substring(9); 
      foreach(string realData in beginningOfData) 
      { 
      //Goes through file 
      } 
     } 
     else 
     { 
      MessageBox.Show("Can't load data"); 
     } 
    } 
} 
+0

這就是我在你的問題下的評論中所要求的。猜猜我不明白你的意思,我得到的印象是這個代碼不會工作,因爲不是每一行都必須包含「Indicator」,這隻需要一行就可以包含它:)。 – Deadzone

0

Contains區分大小寫。試試這個爲你的評價:

line.IndexOf("Indicator", StringComparison.InvariantCultureIgnoreCase) >= 0 
2

您可以包裝foreach到,如果將使用一些LINQ代碼語句,以確定是否所有行包含「指標」:

if (beginningOfData.All(line => line.ToLower().Contains("indicator"))) 
{ 
    string temporary = string.Empty; 
    foreach (string line in beginningOfData) 
    { 
     temporary = line.Substring(9); 
     //Goes through the rest of the file 
     //Converts data to control value and adds it 
    } 
} 
else 
{ 
    System.Windows.Forms.MessageBox.Show("Can't load data."); 
} 
+0

是否在line =>行內聲明瞭一個新變量?否則,我不明白它來自哪裏。 – BeginnerCoder

+0

@BeginnerCoder這被稱爲lambda表達式,它在內部使用'foreach'循環操作,因此這基本上是這裏的'line' foreach(行中的var行)'。我可以包含一個foreach例子來說明它是如何工作的。 – Deadzone

+0

我跟着你想做的事情,但沒有使用lambda,並得到它的工作。感謝燈泡時刻! – BeginnerCoder