2017-09-01 20 views
-3

メソッドDeleteTesterは、TestingCompany.txtから選択したテスターの行を削除する必要があります。 テスターが既にEquipmentテスターに​​割り当てられている場合、削除しないでください。c#elseが正しく動作しない場合

マイコードが正しく機能しません。テスターが機器に割り当てられると、「このテスト会社は機器に割り当てられています」というエラーメッセージが表示され、テスターが削除されます。テスターは削除しないでください。

public void DeleteTester(string testerData) 
{ 
    string line_to_delete = testerData; 
    string[] line_to_Delete_Array= theEntity.setString(line_to_delete); 
    string testerToDelete = line_to_Delete_Array[0]; 
    foreach (var line in File.ReadLines(@"C:\\Temp\\Equipment.txt")) 
     if (line.EndsWith(testerToDelete, StringComparison.CurrentCultureIgnoreCase)) 
     { 
      MessageBox.Show("This testing company is assigned to Equipment", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
     else 
     { 
      string strFilePath = @"C:\\Temp\\TestingCompany.txt"; 
      string strSearchText = testerData; 
      string strOldText; 
      string n = ""; 
      StreamReader sr = File.OpenText(strFilePath); 
      while ((strOldText = sr.ReadLine()) != null) 
      { 
       if (!strOldText.Contains(strSearchText)) 
       { 
        n += strOldText + Environment.NewLine; 
       } 
      } 
      sr.Close(); 
      File.WriteAllText(strFilePath, n); 
     } 
} 

方法のsetStringは

public string[] setString(string newString) 
     { 
      sString = newString; 
      setStrings = sString.Split(','); 
      return setStrings; 
     } 

機器ファイルファイルの行から配列を返す "" 区切りで情報を持っている

1,voltmeter,25/07/2017,1 
2,multimeter,31/08/2017,2 
3,ampermeter,31/07/2016,3 
4,voltmeter,29/08/2016,1 

テスト企業のファイルデータ

1,Testing Ltd,2 New North Rd,Auckland,2678 
2,Q Testing Ltd, 4 Dominion Street,Auckland,5678 
3,Metrology Limited,2 Dominos St,Christchurch,3456 

デルeteTester()

private void btnDeleteTester_Click(object sender, EventArgs e) 
     { 
      string deleteTester = lstTestingCompanies.GetItemText(lstTestingCompanies.SelectedItem); 
      theController.DeleteTester(deleteTester); 
} 

deleteTesterは、それが動作するデータ1,Testing Ltd,2 New North Rd,Auckland,2678

固定コードを持っていますが、それだけのパターンであり、それはよく

public void DeleteTester(string testerData) 
     { 
      string line_to_delete = testerData; 
      string[] line_to_Delete_Array = theEntity.setString(line_to_delete); 
      string testerToDelete = line_to_Delete_Array[0]; 

      string[] checkEquipment = File.ReadAllLines(@"C:\\Temp\\Equipment.txt"); 

      foreach (string s in checkEquipment) 
      { 
       string[] TesterToDelete = theEntity.setString(s); 

       if (Convert.ToInt32(TesterToDelete[3]) == Convert.ToInt32(testerToDelete)) 
       { 
        MessageBox.Show("This testing company is assigned to Equipment", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        flag = 1; 
        break; 
       } 
      } 
      if (flag != 1) 
      { 
       string strSearchText = testerData; 
       string strOldText; 
       string n = ""; 
       StreamReader sr = File.OpenText(@"C:\\Temp\\TestingCompany.txt"); 
       while ((strOldText = sr.ReadLine()) != null) 
       { 
        if (!strOldText.Contains(strSearchText)) 
        { 
         n += strOldText + Environment.NewLine; 
        } 
       } 
       sr.Close(); 
       File.WriteAllText(@"C:\\Temp\\TestingCompany.txt", n); 
      } 

     } 
+2

プログラムをデバッグするとき、 'line'の値は何ですか?' testerToDelete'の値は何ですか? – Jasen

+1

サンプルデータエントリを投稿する – iceDragon

+2

はい、両方のファイルのサンプルデータと予想される最終結果を投稿してください。 – Sach

答えて

2

後に設計されていない固定バージョンです意図した作業が完了したコードのつまり、渡された文字列の最初の番号が装置ファイル内のどの装置にも割り当てられていない場合、その行は会社ファイルから削除されます。

私は冗長コードを削除し、それを掃除しました。 最初に、ファイルを開いている間に他の操作を行うのは良い方法ではありません。その代わりに、内容を読み、ファイルを閉じて、自分のものを行い、ファイルに書き戻す必要がある場合は、再度開いて書き換えます。他にやるべき理由がない限り。

public static void DeleteTester(string testerData) 
{ 
    string[] line_to_Delete_Array = testerData.Split(','); 
    string testerToDelete = line_to_Delete_Array[0]; 
    string equipmentFile = @"C:\Temp\Equipment.txt"; 
    string companyFile = @"C:\Temp\TestingCompany.txt"; 

    var equipmentData = File.ReadLines(equipmentFile); 
    var companyData = File.ReadLines(companyFile); 

    foreach (var line in equipmentData) 
    { 
     if (line.EndsWith(testerToDelete, StringComparison.CurrentCultureIgnoreCase)) 
     { 
      Console.WriteLine("This testing company is assigned to Equipment"); 
      break; 
     } 
     else 
     { 
      var finalList = new List<string>(); 
      foreach(var company in companyData) 
      { 
       if (!company.Contains(testerData)) 
        finalList.Add(company); 
      } 
      File.WriteAllLines(companyFile, finalList.ToArray()); 
      break; 
     } 
    } 
} 

P.S. あなたはを取得しました。このテスト会社は、最初に11は機器ファイル内の機器に割り当てられた番号であるため、elseの記述には含まれないため、機器に割り当てられています。このコードを実行する前に、機器ファイルを下に変更してみてください。

1、電圧計、25/07/2017,555

2、マルチメータ、31/08/2017,2

3、ampermeter、31/07/2016,3

4、電圧計、29/08/2016,555

もつとも

他の多くの人が指摘したように、あなたのアプローチは極端にであり、非常に多くの場所で間違っている可能性があります。あなたのボタンクリックイベントで


SUGGESTION 1

、代わりにテストの全体のラインを取得し、DeleteTester()関数に渡す、(単に1あなたの例の文字列で)番号を抽出し、それをintegerとして渡してください。

はその後DeleteTester()機能であなたの機器のファイルを読み込み、各行の最後に参照番号を隔離し、integerにそれを変換するために、適切なCSVリーダーのいくつかの並べ替えを使用します。

line.EndsWith()の代わりに、integerの比較を行い、存在するかどうかを確認してください。

elseで、CSVリーダーを使用して、各行の最初の番号を分離し、intに変換し、一致する場合は、行を削除します。


SUGGESTION 2

はさえ、それは非常に良い方法ではありません。あなたが本当に徹底したいと思えば、私はあなたがすべきだと思います、DBを使用するか、それが過剰なものであれば、データを格納するために少なくとも構造化されたXMLファイルです。

関連する問題