我正在Windows表单中构建C#应用程序。
我有一个车辆课和两辆派生的汽车和摩托车。
然后,我将车辆保存到列表中。
现在,我有了一个形式,我只想显示汽车或仅显示摩托车。在主要形式中,有一个按钮"显示车"和另一个按钮"显示摩托车",他们将告诉其他形式列出的形式(在下面代码中的" type"变量(。
在节目表格中,我有一个ComboBox,它将显示所有汽车或摩托车(只有一辆,而不是两者(,并且在选择一个汽车时,有一些文本框将显示该信息。
填充我使用的组合:
foreach (Vehicle V in GetVehiclesList())
{
if (type == "Car")
{
if (V.WhatIsIt() == "Car")
{
combobox.Items.Add(V.GetVehicleName());
}
}
else if (type == "Motorbike")
{
if (V.WhatIsIt() == "Motorbike")
{
combobox.Items.Add(V.GetVehicleName());
}
}
}
注意:whatisit((返回带有类的名称的字符串。
现在问题是在Combobox中获取所选车辆以显示该车辆的信息。
如果我想显示所有车辆,我将使用此方法:
private void combobox_SelectedIndexChanged(object sender, EventArgs e)
{
VehicleToShow = GetVehiclesList()[combobox.SelectedIndex];
vehicle_name_textbox.Text = VehicleToShow.GetVehicleName();
// and goes on
}
这样做的是,它获取了选择的ComboBox项目的索引号,并将车辆在列表中使用相同的位置编号。之所以起作用,是因为将车辆添加到Combobox的位置/索引与列表相同。因此,它仅用于显示其中一个(汽车或摩托车(,因为列表中的位置编号将无法等于Combobox中的索引。
所以我使用了循环方法:
private void combobox_SelectedIndexChanged(object sender, EventArgs e)
{
VehicleToShow = null;
int carposition = 0;
int motorbikeposition = 0;
int comboboxindex = combobox.SelectedIndex;
foreach (Vehicle V in GetVehiclesList())
{
if (V.WhatIsIt() == "Car")
{
if (carposition == comboboxindex)
{
VehicleToShow = V;
}
else
{
carposition++;
}
}
else if (V.WhatIsIt() == "Motorbike")
{
if (motorbikeposition == comboboxindex)
{
VehicleToShow = V;
}
else
{
motorbikeposition++;
}
}
}
vehicle_name_textbox.Text = VehicleToShow.GetVehicleName();
// and goes on
}
在我看来这应该有效的东西,而在使用它时,它不会显示Combobox中选择的车辆的信息。
我该如何工作?
注意:将每种车辆类型放入其他列表中不是一个选项。另外,搜索列表以与所选值相同的对象搜索列表不是最好的选择,因为如果它具有两辆具有相同名称的车辆,则无法正常工作。理想情况下,这将与我尝试使用的方法类似。
不要将对象的名称添加到列表中。代替添加实际对象;然后,combobox.SelectedItem
立即包含您需要的所有内容,而无需任何任何查找,因为它将是完整的对象。
数据的填充:
this.combobox.Items.Clear();
foreach (Vehicle veh in this.GetVehiclesList())
{
// assuming "type" is a string variable filled up by some other selected value.
if (!String.Equals(type, typeof(veh).ToString()))
continue;
this.combobox.Items.Add(veh);
}
尽管Derloopkat将type
作为实际Type
保存的建议,因此您可以直接比较它们可能比字符串比较更有效。避免在代码中比较字符串;它们通常是可以在内部更优雅,更有效地完成操作的丑陋程序员捷径。
要使它们正确显示在列表中,只需在返回实际车辆名称的车辆类中添加ToString()
功能:
public override String ToString()
{
return this.GetVehicleName()
}
最后,检索所选对象并更新UI:
private void combobox_SelectedIndexChanged(Object sender, EventArgs e)
{
// "as" is a "try cast": if the object is not the expected type it will become null.
this.VehicleToShow = this.combobox.SelectedItem As Vehicle;
if (this.VehicleToShow == null)
return; // maybe add code to clear UI
this.vehicle_name_textbox.Text = this.VehicleToShow.GetVehicleName();
// fill in the rest
}