从具有两种类型对象的列表中获取ComboBox选定值,组合框仅显示其中一种

时间:2018-02-05 19:36:43

标签: c# winforms combobox

我在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
}

虽然在我看来这应该是可行的,但在使用它时,它不会显示组合框中所选车辆的信息。

我怎样才能让它发挥作用?

注意:不能将每种车辆类型放在不同的列表中。此外,搜索具有与所选值相同名称的对象的列表不是最佳选择,因为如果它具有两个具有相同名称的车辆则不能正常工作。理想情况下,它会与我尝试使用的方法类似。

1 个答案:

答案 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
}