2017-10-07 18 views
0

実行しようとしているC#プログラムは、車のモデル、製造元、年、およびVIN番号を含むファイルを読み込むことになっています。これらの項目は配列に格納され、VIN番号はコンボボックスに配置され、ユーザーはVINを選択し、対応するモデル、製造元、および年はそれぞれ下のTextBoxに収められます。コンボボックスへの配列項目の追加

私はプログラムを実行すると、私は

エラーSystem.ArgumentNullExceptionを取得します。値はnullにすることはできません。パラメータ名: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値は、実際に私は特定のインデックスに1つのVIN値を示すメッセージボックスをプリントアウトし、配列に入っていることを確認します。

+0

Nullになるアイテムを受け付けない関数に、パラメータitemが渡された時点でエラーが発生しているようです。あなたが提供したコードでそのような呼び出しが表示されません。あなたはエラーが発生したときにはっきりしてください。 Vehicles [j] .VINがnullの場合、あなたのカウントがVehiclesの真の長さを超えているか、Vehicle []の値の一部がNullになるようなVehicleの初期化が間違っていることを意味します。 – Marcus

+0

あなたはあなたの車の配列を作成するコードを入力してください。 –

+0

ようこそスタックオーバーフロー! [ツアー](http://stackoverflow.com/tour)、[ヘルプセンター](http://stackoverflow.com/help)、[良い質問をする方法](http://このサイトがどのように機能するかを確認し、現在および将来の質問を改善するのに役立ち、より良い回答を得るのに役立ちます。 –

答えて

0

コメントでの議論に関しては、Vehicles []の長さが値の数と一致しないため、ループが車両リストの真の長さを超えているようです。

更新:

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); 
     } 
    } 

あなたはシステム・ダイアログを開いている入力ファイルは行ごとに1つのエントリがあることを確認します。 ReadLine()メソッドは、現在処理中の行を「離れて」読み込み、残りの行は処理したばかりの行を残します。データ形式がカンマ区切り形式(.csv)の場合は、各読み取り行を複数の値(モデル、VINなど)に分割するための追加手順が必要です。

+0

それでは、これは、私のtxtファイルの100行から最後の行までの空の値を追加しているか、文字列を配列に入れるループが正しくないのでしょうか? – SIB

+0

あなたは質問を車両[]にデータをロードするために使用しているコードで更新できますか?あなたが現在持っている問題は、Vehicles.length()が100であるということです。あなたのソースファイルが20台の車両のみで構成されていても、あなたのループは常に0から99になります。追加した車両の実際の値にカウントを設定する必要があります。したがって、ソースファイルからどのようにデータを追加するかを確認する必要があります。 – Marcus

+0

@SIBこれについてさらに問題はありますか? – Marcus

0

固定長の配列を使用しません長さ代わりに、項目を挿入すると自動的に拡大するList<Vehicle>を使用します。 ComboBoxにアイテムを挿入するために行うループは、読み取りループ内に入れ子になっています。つまり、すべてのアイテムを何度も繰り返し追加しています。 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; 

、コンボボックスに文字列を追加すると、アイテムが選択されると、バックの車にそれらを変換する必要はありません。リストボックスとコンボボックスは、任意のタイプのデータを直接格納できます。

関連する問題