从具有两种类型的对象的列表中获取ComboBox选择的值,而ComboBox仅显示其中一个



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

相关内容

  • 没有找到相关文章

最新更新