尝试转换listbox.selecteditem时是否为空引用?

时间:2016-05-22 20:05:40

标签: c# .net wpf visual-studio listbox

因此,对于学校作业,我必须制作一个动物收容所,

有两个对象:Cats和Dogs,对象的每个新实例都会添加到对象列表中,如下所示:

    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对象或cat对象,这就是为狗做的:

 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();
        }
    } 

无论我似乎尝试什么,当我投射对象时,它返回一个空引用,我不知道为什么,任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

ListBox的项集合将接受任何类型的对象。您目前正在将对象从CatDog转换为string,然后再添加,当然当您使用as并尝试将string强制转换为Dog,它失败了。 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元素时,在使用Dog时,您将获得as个实例。

当然,对于Cat元素,结果将为null。您仍然需要确保处理null值(通过在Dog时不尝试转换为Cat,反之亦然,或者检查{ {1}}结果)。

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

另一个问题是你要在同一个列表框中添加Dog和Cat对象,所以当你查找一只猫并尝试将它投射到狗时,你也会得到一个空引用异常。所以你可能想在转换之前使用GetType()方法检查类型。