我在Windows窗体中构建C#应用程序 我有一个车辆类和两个派生类汽车和摩托车 然后我将车辆保存到列表中。
现在我有一个表格,我只想展示汽车或只展示摩托车。在一个主要形式有一个按钮"显示汽车"另一个按钮"显示摩托车"并且他们将告诉另一个表单列出哪个("在下面的代码中键入"变量)。
在节目表格中,我有一个组合框,它将显示所有存在的汽车或摩托车(只有一个,而不是两个),当选择一个时,会有一些文本框显示该信息。
填充我使用的组合框:
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()返回一个包含类'的字符串。名。
现在问题是让组合框中的选定车辆显示该车辆的信息。
如果我想展示所有车辆,我会用这个:
private void combobox_SelectedIndexChanged(object sender, EventArgs e)
{
VehicleToShow = GetVehiclesList()[combobox.SelectedIndex];
vehicle_name_textbox.Text = VehicleToShow.GetVehicleName();
// and goes on
}
这样做是获取所选组合框项目的索引号,然后使用相同的位置编号获取列表中的车辆。 它的工作原理是因为车辆被添加到组合框中,其位置/索引与列表中的位置/索引相同。 因此,它不能只显示其中一个(汽车或摩托车),因为列表中的位置编号将不能与组合框中的索引相等。
所以我使用了以下方法:
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
}
虽然在我看来这应该是可行的,但在使用它时,它不会显示组合框中所选车辆的信息。
我怎样才能让它发挥作用?
注意:不能将每种车辆类型放在不同的列表中。此外,搜索具有与所选值相同名称的对象的列表不是最佳选择,因为如果它具有两个具有相同名称的车辆则不能正常工作。理想情况下,它会与我尝试使用的方法类似。
答案 0 :(得分:2)
不要将对象的名称添加到列表中。改为添加实际对象;然后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()
}
最后,要检索所选对象并更新您的用户界面:
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
}