2013-01-17 61 views
0

我有一個名爲Vehicle的類和一個名爲Car的類,它繼承自Vehicle。我有一個表單,您可以通過填寫一些信息並單擊按鈕來創建汽車對象。這個信息被插入到一個gridview中。訪問方法外的對象的多個實例

我想要做的就是通過我創建的ID訪問一個指定的Car對象。

我創建了一個ID來標識每個汽車物體。我希望能夠訪問某個對象,例如ID爲3的Car對象。

我有一個組合框,我想填充所有車號,以便稍後可以選擇特定的車對象並作爲例子克隆它。我使用一個事件來檢查RowsAdded到DataGridView。添加一行時,ComboBox應與car id一起添加。

我遇到的問題是,如果檢查RowsAdded,我無法訪問對象testCar。我試圖在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); 
    } 
+1

的最後一行添加到DataGridView去年汽車爲什麼你必須按一下按鈕和DataGrid突變在'Car'類?那真的是你的代碼是如何組織的,還是在這裏張貼錯誤?將UI與業務邏輯分開。 「Car」類應該對按鈕等概念一無所知。 – Servy

+0

對不起。事件buttonclick不在汽車類內,它完全在不同的類文件中。如果你可以調用它,buttonclick在「main」類文件中。對不起,總共n00b; 9) –

回答

0

A 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]; 
} 
+0

對於總共n00b感到抱歉,但我在哪裏放置GetCar方法?我收到有關不一致可訪問性的錯誤。不一致的可訪問性:返回類型'_4stepbystep.Car'不方便'_4stepbystep.v3start.GetCar(int)'我將字典和getcar方法直接放在窗體類後面 –

+0

@ user1987473'Car'類應該是' public'。把它放在類型的定義之前。 – Servy

+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的地方。

+0

嗯好的。比方說,我已經創建了一個列表,可以容納5輛不同的汽車。我如何訪問列表中的專用車? –

+0

如果你有鏈接,你可以做一些像CarList.Where(cl => cl.iD = myID).First()。 –

+0

@ user1987473您也可以遍歷列表 –

0

無需收藏! 您可以訪問已通過訪問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); 
} 
+0

但他不想要最後一個,他想要一個基於ID的任意一個... – Servy

+0

我更習慣於數據庫。在SQL中,我會做一些類似於從carID = 3的汽車中選擇*。我會從特定的汽車中獲取價值,並對其進行處理,例如更新或克隆它。這基本上是我想用這個汽車對象做什麼。有沒有簡單快捷的方式來訪問已創建的每個對象?無論何時添加新行,我可能都需要完全不同的hehe –

+0

,它的id被插入到組合框中。後來他可以使用這些ID並從datagridview –