2017-06-16 3 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を閉じようとするたびに、それは再び表示されます。

は、だから私は、代わりにこのことを決めた:

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を閉じて再度試してみるだけです。

+0

ファイルには、 'Indicator'という値を持つ行が含まれていますか、ファイルからのすべての行に単一の' Indicator'値が必要ですか? – Deadzone

+0

最初のもの。 私はそれはのように表示されます作成されたテキストファイルを開くとき: インジケータ、データ (単なる例):1、データ2: ライン1:「someText」 のLine2言葉は、 – BeginnerCoder

+0

はこれが有効なファイルを考えられています: "インジケータ" ... – Deadzone

答えて

0

と:あなたはすべての行は、「指標」を含めるかどうかを判断するためにいくつかのLINQのコードを使用しますif文の中にforeachをラップすることができます

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

これはあなたの質問の下で私のコメントで尋ねてきたものです。あなたが何を意味するのか分からなかったと思いますが、このコードは必ずしもすべての行が必ずしも "インジケータ"を含んでいるわけではないという印象を受けました。 – Deadzone

0

Containsでは大文字と小文字が区別されます。私が代わりにこれをしなかった

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."); 
} 
2

:あなたの評価のためにこれを試してみてくださいそれは私のアプリケーションのために働いた

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

行内の行は=>行に宣言されている新しい変数ですか?そうでなければ、どこから来ているのか分かりません。 – BeginnerCoder

+0

@BeginnerCoderこれはラムダ式と呼ばれ、内部的には 'foreach'ループで動作するので、これは基本的に' foreach(行内のvar行) 'です。どのように動作するかを説明するためにforeachサンプルを含めることができます。 – Deadzone

+0

私はあなたがやろうとしていたことに従っていますが、ラムダを使わずにそれを動作させました。電球の瞬間をありがとう! – BeginnerCoder

関連する問題