访问方法之外的对象的多个实例

时间:2013-01-17 15:01:56

标签: c# winforms

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

我想要做的是通过我用它创建的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);
    }

3 个答案:

答案 0 :(得分: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最适合的地方。

答案 1 :(得分:0)

Dictionary仅适用于此类任务。

在表单上创建一个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];
}

答案 2 :(得分: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);
}