0

我有一个名为的类Vehicle和一个名为的类Car,它继承自Vehicle. 我有一个表单,您可以在其中通过填写一些信息并单击按钮来创建汽车对象。此信息被插入到网格视图中。

我想要做的是通过我创建它的 ID 访问特定的 Car 对象。

我创建了一个 ID 来识别每个汽车对象。我希望能够访问某个对象,例如 ID 为 3 的 Car 对象。

我有一个组合框,我想用所有的汽车 ID 填充它,以便稍后我可以选择一个特定的汽车对象并克隆它,例如。我使用一个事件来检查 RowsAdded 到DataGridView. 添加行时,ComboBox应将 与 一起添加car id

我遇到的问题是testCar在检查RowsAdded. 我试图在buttonclick事件之外声明对象实例,然后在事件内部更改该对象,buttonclick但这不起作用。我在想,也许我需要创建一个对象数组,在其中插入每辆不同的汽车。

这是我的代码:

class Car : Vehicle
{
    string carBrand = "";
    private static int carID { get; set; }
    public int iD { get; set; }
    public string CarBrand { get; set; }
    public Color CarColor { get; set; }
    public Car()
    {
        carID = 0;
        CarBrand = "Volvo";
        CarColor = Color.Black;
    }
    public Car(string vehicleName, int vehicleYear, string carBrand, Color carColor)
    {
        this.iD = GetNextCarID();
        this.VehicleName = vehicleName;
        this.VehicleYear = vehicleYear;
        this.CarBrand = carBrand;
        this.CarColor = carColor;
    }
    static Car() 
    {
        carID = 0;

    }
    protected int GetNextCarID()
    {
        return ++carID;
    }


    public void button1_Click(object sender, EventArgs e)
    {

        string inputModell = txtModell.Text;
        int inputCarYear = Int16.Parse(txtCarYear.Text);
        string inputBrand = cmbCarBrands.SelectedItem.ToString();
        Color inputColor = Color.Black;
        if (colorDialog1.Color != Color.Black)
        {
            inputColor = colorDialog1.Color;
        }
        Car testCar = new Car(inputModell, inputCarYear, inputBrand, inputColor);
        int id = testCar.iD;

        if (txtModell.Text != string.Empty && txtCarYear.Text != string.Empty)
        {                
            dataGridView1.ColumnCount = 6;
            dataGridView1.Columns[0].Name = "ID";
            dataGridView1.Columns[1].Name = "Modell";
            dataGridView1.Columns[2].Name = "Årtal";
            dataGridView1.Columns[3].Name = "Märke";
            dataGridView1.Columns[4].Name = "Färg";
            dataGridView1.Columns[5].Name = "Orginal/Klon";
            int currRow = dataGridView1.Rows.Add(testCar.iD, testCar.VehicleName, testCar.VehicleYear, testCar.CarBrand, "", "Orginal");
            DataGridViewCellStyle cellStyle = new DataGridViewCellStyle();
            cellStyle.BackColor = testCar.CarColor;
            dataGridView1.Rows[currRow].Cells[4].Style = cellStyle; 
        }
    }

    private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
    {
        groupBox2.Enabled = true;
        cmbCarID.Items.Add(testCar.iD);
    }
4

3 回答 3

0

是的,听起来你想要收集汽车,类似这样的东西

class Car : Vehicle
{
    ...

    List<Car> CarList;
    public Car()
    {
        CarList = new List<Car>  // do this in each constructor
        ...
    }

    ...


    public void button1_Click(object sender, EventArgs e)
    {
        Car car = new Car();

        ...

        CarList.Add(car);
    }
}

顺便说一句,我不知道Car上课是否是最合适的地方button_1Click

于 2013-01-17T15:10:08.460 回答
0

ADictionary只是为这样的任务而设计的。

在您的表单上创建Dictionary<int, Car>一个字段:

private Dictionary<int, Car> carLookup = new Dictionary<int, Car>();

然后在您的按钮单击事件中将每辆新车添加到其中:

carLookup[newCar.iD] = newCar;

您现在可以使用字典轻松地通过 ID 查找汽车:

public Car GetCar(int id)
{
    return carLookup[id];
}
于 2013-01-17T15:14:03.517 回答
0

无需收藏!您可以通过访问 datagridview 的最后一行来访问已添加到 datagridview 的最后一辆车

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    int lastRowIndex = dataGridView1.Rows.Count-1;
    int carId = int.Parse(dataGridView1.Rows[lastRowIndex].Cells[0].Value.ToString());
    groupBox2.Enabled = true;
    cmbCarID.Items.Add(carId);
}
于 2013-01-17T15:17:48.927 回答