2017-10-07 131 views
0

我試圖運行的C#程序應該讀取包含汽車模型,製造商,年份和VIN號碼的文件。將這些項目放入數組中,然後將VIN編號放入組合框,以便用戶選擇VIN,並在相應的文本框中分別顯示相應的型號,製造商和年份。將數組項添加到組合框

當我運行該程序,我得到

錯誤System.ArgumentNullException:值不能爲空。參數名稱:item。

這是我的代碼塊發生問題的塊。

StreamReader inputFile; 

     int i = 0, count=Vehicles.Length; 
     if (openFile.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
     { 
      inputFile = File.OpenText(openFile.FileName); 

      while (!inputFile.EndOfStream) 
      { 
       Vehicles[i].Model = inputFile.ReadLine(); 
       Vehicles[i].Manufacturer = inputFile.ReadLine(); 
       Vehicles[i].Year = inputFile.ReadLine(); 
       Vehicles[i].VIN = inputFile.ReadLine(); 
       i++;    
       for (int j = 0; j < count; j++) 
       { 
       vinCBox.Items.Add(Vehicles[j].VIN); 
       } 
      } 

爲了確保VIN值實際上進入陣列,我打印出一個MessageBox,在某個索引處顯示一個VIN值。

+0

錯誤似乎發生在參數「item」被傳遞給某個不接受item爲空的函數的時候。我沒有在代碼中看到你提供的這種調用。你能否在發生錯誤時請清楚。 在我看來,像Vehicle [j] .VIN爲null,這意味着您的計數超過了車輛的真實長度,或者車輛的初始化出現問題,因此Vehicles []的某些值爲空。 – Marcus

+0

您可以提供代碼,在哪裏創建您的車輛陣列。 –

+0

歡迎來到Stack Overflow!請通過[tour](http://stackoverflow.com/tour),[幫助中心](http://stackoverflow.com/help)和[如何提出一個好問題](http:// stackoverflow.com/help/how-to-ask)章節,瞭解本網站的工作原理,並幫助您改善當前和未來的問題,從而幫助您獲得更好的答案。 –

回答

0

關於我們在評論中的討論,錯誤似乎是車輛[]的長度與值數不匹配,因此,循環超出了車輛列表的真實長度。

更新:

StreamReader inputFile; 

    int i = 0, count=Vehicles.Length; 
    if (openFile.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
    { 
     inputFile = File.OpenText(openFile.FileName); 

     while (!inputFile.EndOfStream) 
     { 
      Vehicles[i].Model = inputFile.ReadLine(); 
      Vehicles[i].Manufacturer = inputFile.ReadLine(); 
      Vehicles[i].Year = inputFile.ReadLine(); 
      Vehicles[i].VIN = inputFile.ReadLine(); 
      i++;    

     } 

     for (int j = 0; j < i; j++) 
     { 
      vinCBox.Items.Add(Vehicles[j].VIN); 
     } 
    } 

確保您輸入的文件,你與系統的對話中開有每行一個條目。 ReadLine()方法讀取它當前正在處理的行,將數據流留給其餘行,但只處理它。如果您的數據格式是逗號分隔格式(.csv),則需要執行其他步驟將每條讀取行分割爲多個值(型號,VIN等)

+0

那麼這會是,它是從100到所有txt文件的最後一行添加空值,或者我的循環將字符串放入數組是不正確的? – SIB

+0

您能否用您用來將數據加載到車輛中的代碼更新您的問題[]。您目前遇到的問題是Vehicles.length()爲100.即使您的源文件僅包含20輛車,您的循環將始終從0到99.您需要將計數設置爲添加車輛的實際值。因此,有必要了解,您如何從源文件添加數據。 – Marcus

+0

@SIB你對此有任何進一步的問題嗎? – Marcus

0

我不會使用具有固定長度。而是使用在插入項目時自動增長的List<Vehicle>。 將項目插入到組合框中的循環嵌套在讀取循環中,即您要一遍又一遍地重複添加所有項目。 ComboBox可以通過分配數據源來填充。無需添加項目。

var Vehicles = new List<Vehicle>(); 
if (openFile.ShowDialog() == System.Windows.Forms.DialogResult.OK) { 
    using (var inputFile = File.OpenText(openFile.FileName)) { 
     while (!inputFile.EndOfStream) { 
      var v = new Vehicle { 
       Model = inputFile.ReadLine(), 
       Manufacturer = inputFile.ReadLine(), 
       Year = inputFile.ReadLine(), 
       VIN = inputFile.ReadLine() 
      }; 
      Vehicles.Add(v); 
     } 
    } // The using statement closes the file automatically here. 

    // Fill the listbox; 
    vinCBox.DataSource = Vehicles; 
} 

在Vehicle類中,覆蓋ToString()。 ListBox自動使用此字符串來顯示ListBox中的項目。 您可以檢索選定的項目:

var selectedVehicle = (Vehicle)vinCBox.SelectedItem; 

因此,沒有必要對字符串添加到組合框,然後將其轉換回車輛,一旦某一項選擇。 ListBox和ComboBoxes可以直接存儲任何類型的數據。