0

から継承するVehicleという名前のクラスとという名前のクラスがあります。情報を入力してボタンをクリックすることで、車のオブジェクトを作成できるフォームがあります。この情報はグリッドビューに挿入されます。CarVehicle

私がやりたいのは、作成したIDで特定のCarオブジェクトにアクセスすることです。

各車のオブジェクトを識別するためのIDを作成しました。ID 3のCarオブジェクトなど、特定のオブジェクトにアクセスできるようにしたい。

例として、後で特定の車のオブジェクトを選択してクローンを作成できるように、すべての車のIDを入力するコンボボックスがあります。RowsAddedtoをチェックするイベントを使用します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 に答える