我正在尝试运行的C#程序应该读取包含汽车模型,制造商,年份和VIN编号的文件。将这些项放入数组中,然后将VIN编号放在ComboBox中,以便用户选择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值实际进入数组,我打印出一个MessageBox,显示某个索引处的VIN值。
答案 0 :(得分: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()方法读取&#34;远离&#34;它当前正在处理的行,将数据流与其余行保留在一起但只是处理它的那一行。如果您的数据格式是逗号分隔格式(.csv),则需要执行其他步骤,将每个读取行拆分为多个值(模型,VIN等)
答案 1 :(得分: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;
因此,无需在组合框中添加字符串,然后在选择项目后将其转换回车辆。 ListBoxes和ComboBoxes可以直接存储任何类型的数据。