【问题标题】:Am I missing an if statement?我错过了一个 if 语句吗?
【发布时间】:2010-12-03 00:37:46
【问题描述】:

提前感谢您的帮助!

一些背景知识基本上我正在构建一个存储车辆(汽车、卡车、公共汽车)的应用程序,我有一个车辆超类,所有单独的类(car.cs、truck.cs、minibus.cs)都继承自这个超级类。

我还有一个名为“fleet”的类,我想将车辆添加到其中,然后在列表框中显示结果。

我的其他一切都在工作,但我无法像汽车那样让卡车和小巴更新并显示在列表框上。

这是我的车队课程,其中包括 car.cs;它工作正常,从汽车表单中获取的数据被添加并显示在列表框中。

class Fleet
{
    private List<Vehicle> theFleet = new List<Vehicle>(); 

    public List<Vehicle> fleet 
    {
        get
        {
            return theFleet;
        }
    }

    public void deleteFromFleet(Vehicle aCar)
    {
        theFleet.Remove(aCar);
    }

    public void addToFleet(Vehicle aCar)
    {
        theFleet.Add(aCar);
    }
}

这是我的主要表单,上面有列表框:

public partial class FrmHireCo : Form
{
    private Fleet myFleet = new Fleet();
    private ClientList mycustomer = new ClientList();

    //Fleet object used to store cars

    public FrmHireCo()
    {
        //Default constructor
        InitializeComponent();                
    }        

    private void updateFleetList()
    {   
        lstFleet.Items.Clear();
        foreach (Car c in myFleet.fleet)
        {
            string line = "Car: " + c.make+" " + c.colour;
            lstFleet.Items.Add(line);
        }
    }

    private void updateClientList()
    {   
        customers.Items.Clear();
        foreach (Customer c in mycustomer.clientlist)
        {
            string line = "Customer: " + c.name + " " + c.address;
            customers.Items.Add(line);
        }
    }

    private void btnAddCar_Click(object sender, EventArgs e)
    {
        //Add a new car
        FrmCar carGui = new FrmCar(); //Form used to add new car
        carGui.ShowDialog();
        Car myCar = carGui.car;         //Get new car from form
        myFleet.addToFleet(myCar);      //Add to fleet list
        updateFleetList();              //Uodate fleet list
    }

    private void lstFleet_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (lstFleet.SelectedIndex > -1)
        {
            int index = lstFleet.SelectedIndex;
            Car myCar = myFleet.fleet.ElementAt(index);
            FrmCar carGui = new FrmCar();
            carGui.car = myCar;
            carGui.Show();
        }
    }

    private void btnCustomer_Click(object sender, EventArgs e)
    {
        FrmCustomer customerGui = new FrmCustomer();
        customerGui.ShowDialog();
        Customer mycustomer = customerGui.customer;         
        mycustomer.addToClientList(mycustomer);      
        updateFleetList();
    }

    private void customers_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (customers.SelectedIndex > -1)
        {
            int index = customers.SelectedIndex;
            Customer myCustomer = mycustomer.clientlist.ElementAt(index);
            FrmCustomer customerGui = new FrmCustomer();
            customerGui.customer = myCustomer;
            customerGui.Show();
        }
    }
}

为任何帮助干杯!

【问题讨论】:

  • 您说您提供的代码有效。你能提供不起作用的代码吗?这就是你想要的帮助对吧?
  • 我看到的唯一类型转换是 Car。我不确定您对公共汽车和小型货车的引用在哪里...另外我建议使用 List 而不是 List。这样您就不需要对列表内容进行类型转换。确保清晰地声明接口契约,以便在接口中声明汽车、公共汽车和小型货车之间的所有共享属性和功能。
  • 您发布的代码中没有任何内容实际上将卡车或小巴添加到列表框中。您正在使用的只是 Car 对象。
  • 另外,foreach(myFleet.fleet 中的汽车 c) 不应该是 foreach(myFleet.fleet 中的汽车 c)

标签: c# winforms


【解决方案1】:
private void updateFleetList()
    {   
        lstFleet.Items.Clear();
        foreach (Vehicle c in myFleet.fleet)
        {
            string line = "Car: " + c.make+" " + c.colour;
            lstFleet.Items.Add(line);
        }
    }

【讨论】:

  • foreach 应该让每辆车(而不是汽车)离开车队。
  • 所以在 foreach 语句中将 'Car' 更改为 'Vehicle' 将允许我将卡车、小巴、客户添加到列表中吗?
  • 'private void 1stFleet_SelectedIndexChanged' 我是否需要在 if 下添加和 else 语句,以便它无法创建汽车、卡车、公共汽车?
  • @ryan betts:为了澄清,将Car 类型更改为Vehicle允许您将客户添加到列表中.请记住,正如您在原始问题中所说,车辆的所有子类型(汽车、卡车、小巴)都继承自超类 Vehicle。客户不是一种车辆。但它允许您添加任何继承自 Vehicle 基类的类型。
  • @ryan betts:如果您希望您的 SelectedIndexChanged 事件处理程序为每种类型的车辆显示单独的表单,您需要添加一个 if 语句来检查每个 Vehicle 对象的类型当您从列表中提取它并显示适当的形式时。从列表中提取Vehicle 对象(因为一切都是车辆),然后使用typeof 使用if 语句缩小每个车辆的具体类型。
【解决方案2】:

您应该包括所有车辆。

private void updateFleetList()
{   
    lstFleet.Items.Clear();
    foreach (Vehicle v in myFleet.fleet)
    {
        lstFleet.Items.Add(v);  
    }
}

另外,只需在所有 Vehicle 子类中覆盖 ToStringListBox 就会固有地使用它;这样,并不是每个Vehicle 都需要MakeColor 属性。

【讨论】:

  • 我是不是漏掉了一部分控制列表框的方法?我是否缺少 if-else 语句?
  • @ryan betts:你说的控制列表框是什么意思?
  • 我发表了关于这有帮助的评论吗?
  • @ryan betts:只要编辑Vehicles的每个方法也编辑myFleet.fleet,这个版本的updateFleetList就不需要改了。
  • 因此,如果我所有的类都继承自车辆,并且我更改了上面的 updatefleet() 代码,它应该让我将卡车、小巴添加到车队中,我需要在“车队”中进行更改吗' 类,可能从 'acar' 更改为 'avehicle'?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
相关资源
最近更新 更多