2017-09-01 91 views
-3

方法DeleteTester應該從TestingCompany.txt中刪除選中的測試儀的行 如果測試儀已被分配到設備測試儀不應該被刪除。c#if else does not work

我的代碼無法正常工作。當測試人員被分配到設備時,它顯示錯誤消息「該測試公司被分配給設備」並刪除測試人員。測試人員不應該被刪除。

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. 你得到這個測試公司被分配到設備消息,因爲你傳遞的測試數據在開始時有1,而1是分配給設備文件中的設備的編號,因此它永遠不會進入你的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()功能使用某種適當的CSV讀者讀你的設備文件,並在每個行的末尾隔離參考號碼和轉換它變成一個integer

現在,而不是你的line.EndsWith(),做一個integer比較,看看它是否存在與否。

然後,在您的else中,再次使用CSV閱讀器並隔離每行中的第一個數字,將其轉換爲int,如果匹配,則刪除您的行。


SUGGESTION 2

即使這不是一個很好的方法。如果你真的想要徹底,而且我認爲你應該使用數據庫,或者如果這是一個矯枉過正,至少結構良好的XML文件,以存儲你的數據。