2016-08-17 1 views
0

ユーザーがシステムに製品を追加し、製品名で検索できるプログラムがあります。 現時点で同じ名前の2つの製品を入力できることを除いて、すべてが正常に機能しています。私はこれを許さないプログラムが必要です。メソッドはテキストファイルへのデータの保存を中止しているようです

「追加」ボタンに割り当てられたメソッドがあり、製品名、顧客名、ファームウェアの場所がテキストファイルに保存されます。

private void button_Click(object sender, RoutedEventArgs e) 
    { 
     bool found = false; 
     string searchTerm = productNameTextBox.Text.ToUpper(); 


     if ((productNameTextBox.Text == "") || (customerNameTextBox.Text == "") || (firmwareLocationTextBox.Text == "")) 
     { 
      MessageBox.Show("Please fill in all the text boxes"); 

     } 
     else if (Contains(searchTerm) == true) 
     { 
      MessageBox.Show("Product already added"); 
     } 
     else 
     { 
       string inputCustomerName = customerNameTextBox.Text.ToUpper(); 
       string inputProductName = productNameTextBox.Text.ToUpper(); 
       string inputFirmwareLocation = firmwareLocationTextBox.Text; 

       try 
       { 
        Product newProduct = new Product(inputProductName, inputCustomerName, inputFirmwareLocation); 
        newProduct.Save("Products.txt"); 
        File.AppendAllText("ProductNames.txt", inputProductName + Environment.NewLine); 
        MessageBox.Show("Product added"); 
        emptyTheTextBoxes(); 

       } 
       catch 
       { 
        MessageBox.Show("Product could not be added"); 
       } 
      } 
     } 

は、私はまた、ユーザーの製品名は、既に格納されているかどうかを確認するために、テキストファイルを検索し、ブールを返します方法を行っている。ここではその方法です。これはメソッドです:

public bool Contains (string searchTerm) 
    { 
     string line; 
     bool found = false; 


      System.IO.StreamReader file = new System.IO.StreamReader("ProductNames.txt"); 

      while ((line = file.ReadLine()) != null) 
      { 

       if (line.Contains(searchTerm)) 
       { 
        found = true; 
        break; 
       } 
      } 


     if (found == true) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
     file.Close(); 
    } 

私は入力を保存しようとすると、メッセージボックスが「製品を追加することができませんでした」と言って表示されます。しかし、メソッドを呼び出すelse if文をコメントアウトすると、うまく動作します。

メソッドが呼び出されたときにファイルを開いている可能性があり、正しく閉じていない可能性があります。だから私は 'file.Close()'を追加し、それは違いをもたらさなかった。 私はちょうどどこかで愚かな間違いをしたような気がしますが、数時間私を悩ませています!間違いなく目の新鮮なペアをありがとう!私は間違った場所に)(file.closeを持っていた

おかげ ルーシー

+0

catchを変更して例外をキャッチし、「製品を追加できませんでした」ではなくエラーメッセージを出力します。それは間違っていることを教えてくれるでしょう。 – sr28

+2

'catch'を' catch(Exception ex) 'と' MessageBox.Show( "..") 'を' MessageBox.Show(ex.ToString()) 'に変更し、結果のテキストを投稿します。カスタムメッセージは手伝ってくれます。例外はあります。 @ sr28 1秒速く。< – C4u

+0

@ C4u - hehe、私の説明はあまり分かりません。 – sr28

答えて

0

。私はあなたがあなたのオブジェクト/データ管理からオブジェクトの永続化を分離することを示唆している一般的に

public bool Contains (string searchTerm) 
    { 
     string line; 
     bool found = false; 


      System.IO.StreamReader file = new System.IO.StreamReader("ProductNames.txt"); 

      while ((line = file.ReadLine()) != null) 
      { 

       if (line.Contains(searchTerm)) 
       { 
        found = true; 
        break; 
       } 
      } 

     file.Close(); 


     if (found == true) 
     { 
      return true; 

     } 
     else 
     { 
      return false; 
     } 

    } 
+0

コメントの数秒前に:) – sr28

+0

StreamReaderでusingステートメントを試してみてください。https://msdn.microsoft.com/en-GB/library/yh598w02.aspx – sr28

+0

オリジナルのコード*は、CS0162の警告を生成しているはずですあなたが完全に言及に失敗し、(何とか)それが関係していないと思っていた到達不能なコードについては? –

1

:私はそれを動かすのはここです。

プログラムのさまざまな部分で同じファイルのファイルシステムを読み書きしようとしています。ファイルを正しく閉じることができなかったため、ファイルが解放されていないという問題が発生しているようです。

ファイルシステムをデータベースのように扱おうとしていますが、これはおそらく最善の方法ではありません。もちろん、これが必要になる可能性のあるユースケースがあります。

代わりに次のアプローチを提案します。

  1. 起動時にファイルを読み取ります。あなたが記憶しているコレクション に製品をロードしてください。
  2. コレクション内のプログラムの読み取り、更新、作成、削除をプログラムに許可します。
  3. シャットダウン時(必要に応じて手動で起動することもできます)には、 の製品をディスクに保存してください。

これにより、このような問題を回避できます。また、より速くなります。

オプションで、コレクションにHashSet<T>のようなものを使用することもできます。これは重複したエントリを許可しません(Productオブジェクトのequalsとhashcodeをオーバーライドすることを忘れないでください)。次に、コレクションがfalseを返した場合にコレクションに追加しようとすると、追加されず、重複が示されます。これにより、あなたのことを簡単に確認することができます。

関連する問題