将数组项添加到组合框

将数组项添加到组合框

问题描述:

我试图运行的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://*.com/tour),[帮助中心](http://*.com/help)和[如何提出一个好问题](http:// *.com/help/how-to-ask)章节,了解本网站的工作原理,并帮助您改善当前和未来的问题,从而帮助您获得更好的答案。 –

关于我们在评论中的讨论,错误似乎是车辆[]的长度与值数不匹配,因此,循环超出了车辆列表的真实长度。

更新:

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

我不会使用具有固定长度。而是使用在插入项目时自动增长的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可以直接存储任何类型的数据。