2016-05-22 48 views
3

因此,對於學校裏的功課我必須做的一個動物收容所,嘗試投射listbox.selecteditem時的空引用?

有兩個對象:貓,狗,對象的每個新實例添加到對象列表如下:

public Cat Cat { get; private set; } 
    public Dog Dog { get; private set; } 
    public List<Dog> Dogs = new List<Dog>(); 
    public List<Cat> Cats = new List<Cat>(); 

    public void NewCat(string name, Gender gender, string badHabits) 
    { 
     this.Cat = new Cat(name, gender, badHabits); 
     Cats.Add(this.Cat); 

    } 

    public void NewDog(string name, Gender gender) 
    { 
     this.Dog = new Dog(name, gender); 
     Dogs.Add(this.Dog); 
    } 

與更新方法兩份名單被添加到一個列表框這樣的:

private void Update() 
    { 
      lbAnimals.Items.Clear(); 
      lbAnimals.Items.Clear(); 
      foreach (Cat c in reservations.Cats) 
     { 
      lbAnimals.Items.Add(c.ToString()); 
     } 
     foreach (Dog d in reservations.Dogs) 
     { 
      lbAnimals.Items.Add(d.ToString()); 
     } 
    } 

最後,我需要轉換所選對象的列表框中一個Dog對象或貓的對象,這是它是如何的做狗:

private void btnReserveDog_Click(object sender, EventArgs e) 
    { 
     if (this.reservations.Dog != null) 
     { 
      var d= lbAnimals.SelectedItem as Dog; 
       d.Reserve(txtReservor.Text); 
       this.btnReserveDog.Enabled = false; 
      Update(); 
     } 
    } 

無論我似乎嘗試什麼,當我投對象時它返回一個空引用,我不知道爲什麼,任何幫助將不勝感激!

+1

因爲你在列表框中添加字符串作爲元素不是狗 –

+0

你也許有一個例子,我應該怎麼加呢? –

+2

你必須創建一個基類Animal,然後從它繼承Cat和Dog,然後創建一個''List '',其中包含''Cat''和''Dog''爲''Animal'',然後綁定該列表lbAnimals像lbAnimals.DataSource =動物'' –

回答

1

一個ListBox的項目集合將接受任何類型的對象。您目前正在將對象從CatDog轉換爲string,因此當然當您使用as並嘗試將string轉換回Dog時,它會失敗。 A Dog不是string,這意味着您得到null作爲結果(這是as在轉換失敗時的作用)。

所有,如果您需要做的是去除.ToString()。即:

private void Update() 
{ 
    lbAnimals.Items.Clear(); 
    lbAnimals.Items.Clear(); 
    foreach (Cat c in reservations.Cats) 
    { 
     lbAnimals.Items.Add(c); 
    } 
    foreach (Dog d in reservations.Dogs) 
    { 
     lbAnimals.Items.Add(d); 
    } 
} 

然後,當你正在處理的集合中Dog元素,你會使用as時,你得到Dog實例回來。

當然,對於Cat元素,結果將會是null。它仍然是由你來確保你處理null值(無論是不是要轉換爲Dog當它是一個Cat和副反之亦然一個,或者通過檢查null結果)。

+0

這原來是我的解決方案!當我發現這是我在整個星期日坦誠地說的時候,感覺很愚蠢 –

0

在列表框中顯示的對象,最好的辦法是不要轉換爲字符串和背部,而是因爲此對象的字符串屬性那麼這應顯示在列表框中。因此請嘗試使用列表框的DisplayMember屬性。因此,嘗試這種

LbAnimals.DisplayMember = "name"; // this sets tge property of the object that would be displayed to name. 

private void Update() 
{ 
     lbAnimals.Items.Clear(); 
     lbAnimals.Items.Clear(); 
     foreach (Cat c in reservations.Cats) 
    { 
     lbAnimals.Items.Add(c); 
    } 
    foreach (Dog d in reservations.Dogs) 
    { 
     lbAnimals.Items.Add(d); 
    } 
} 

     private void btnReserveDog_Click(object sender, EventArgs e) 
      { 
       if (this.reservations.Dog != null) 
      { 
       //you also missed a null check here, this might raise an exception if no item is selected in the listbox 
      If (lbAnimals.SelectedItem !=null) 
       { 
       Dog d= lbAnimals.SelectedItem as Dog; 
       d.Reserve(txtReservor.Text); 
       this.btnReserveDog.Enabled = false; 
       Update(); 
       } 
      } 
     } 

另一個問題是,您要添加兩者都做狗和貓的反對thesame列表框,所以當你seldct一隻貓,並嘗試將其轉換爲一隻狗,你也將得到一個空引用異常。所以你可能會在鑄造前使用GetType()方法檢查類型。