简体   繁体   English

列表框显示的是类名而不是值

[英]Listbox is displaying class name instead of values

I'm working on a project where the user is supposed to input values to animal (Name, age, gender etc..) and the values entered by the user are supposed to display on a list-box The classes inherit from each other. 我正在开发一个项目,其中用户应该向动物输入值(名称,年龄,性别等),并且用户输入的值应该显示在列表框上。这些类相互继承。 Here is how the inheritance work: 以下是继承的工作原理:

Animal class is the parent for all classes. Animal类是所有类的父级。

Mammal class inherit from Animal class. 哺乳动物类继承自Animal类。

Dog class inherit from Mammal class. 类继承自哺乳动物类。

Cat class inherit from Mammal class Cat类继承自Mammal

Reptile class inherit from Animal class 爬虫类继承自Animal

Snake class inherit from Reptile class Snake类继承自Reptile

Lizard class inherit from Reptile class Lizard类继承自Reptile

The user is able to choose what animal to create. 用户可以选择要创建的动物。 There is one listbox showing the type of animal (Mammal and Reptile) and there is a listbox next to it that that depending on the type of animal selected by the user, it displays its animals. 有一个列表框显示动物的类型(哺乳动物和爬行动物),旁边有一个列表框,根据用户选择的动物类型,它会显示动物。

For exampel, if the user selects Mammal in the listbox, the listbox next to it displays Dog and Cat . 例如,如果用户在列表框中选择“ 哺乳动物 ”,则其旁边的列表框将显示“ 狗”和“ 猫”

This is working perfectly and it's not the problem. 这是完美的工作,这不是问题。

The problem is that when the user enters the animal values (Name and Age) after selecting the animal type in the listbox(for example Mammal , Dog ) and clicks the add button, the result listbox displays Assign1_1.Mammal when trying to add a Mammal animal and Assign_1.Reptile when trying to add a Reptile animal. 问题是,当用户在列表框中选择动物类型(例如MammalDog )后输入动物值(名称和年龄)并单击添加按钮时,结果列表框会在尝试添加哺乳动物时显示Assign1_1.Mammal动物和Assign_1.Reptile在尝试添加爬行动物时。

What I want it to do is to display the values the user entered (Name and Age) in the result listbox but instead it just says Assign1.Mammal or Assign1.Reptile depending on the selected animal. 我想要它做的是在结果列表框中显示用户输入的值(名称和年龄),而只是根据所选动物显示Assign1.MammalAssign1.Reptile

Here is my MainForm code: 这是我的MainForm代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Assign_1
{
    public partial class MainForm : Form
    {
        private Dog m_dog = new Dog();
        private Cat m_cat = new Cat();
        private Snake m_snake = new Snake();
        private Lizard m_lizard = new Lizard();
        private AnimalManager animalmgr  = null;
        private Animal m_animal = new Animal();
        public MainForm()
        {

            //Visual Studio initializations
            InitializeComponent();

            //My initializations
            InitializeGUI();
            Gendercmb.DataSource = Enum.GetValues(typeof(GenderType));
            Categorylst.DataSource = Enum.GetValues(typeof(Categorytype));
            animalmgr = new AnimalManager();

        }

        private void InitializeGUI()
        {
            ReadInput();
        }

        private void ReadInput()
        {
            m_animal.Name = ReadName();
            m_animal.Age = ReadAge();
        }
        private int ReadAge()
        {
            int age = 0;

            int.TryParse(Agetxt.Text, out age);

            return age;
        }

        private string ReadName()
        {
            string name = "";
            name = Nametxt.Text;
            return name;
        }

        private void addMammal(Mammal values)
        {

            ReadInput();

            switch ((MammalType)Animallst.SelectedIndex)
            {
                 case MammalType.Dog:
                    {

                        // Use a copy constructor to set a dog with common data
                        Dog m_dog = new Dog(values);
                        // If more data in GUI to fill in for this animal, do it here
                        //Then send it to the manager for adding to the list
                        animalmgr.add(m_dog);
                        break;
                   } 
                case MammalType.Cat:
                    {
                        Cat m_cat = new Cat();
                        animalmgr.add(m_cat);
                        break;
                    }
            }
        }

        private void AddReptile(Reptile values)
        {
            ReadInput();

            switch ((ReptileType)Animallst.SelectedIndex)
            {
                case ReptileType.Snake:
                    {

                        // Use a copy constructor to set a snake with common data
                        Snake m_snake = new Snake(values);
                        // If more data in GUI to fill in for this animal, do it here
                        //Then send it to the manager for adding to the list
                        animalmgr.add(m_snake);
                        break;
                    }
                case ReptileType.Lizard:
                    {
                        Lizard m_lizard = new Lizard();
                        animalmgr.add(m_lizard);
                        break;
                    }
            }
        }

        //When user clicks "Add to list"
        private void button1_Click(object sender, EventArgs e)
        {
            ReadInput();

            switch ((Categorytype)Categorylst.SelectedIndex)
            {
                case Categorytype.Mammal:
                    {
                        Mammal mammal = new Mammal(m_animal);
                        addMammal(mammal);
                        break;
                    }
                case Categorytype.Reptile:
                    {
                        Reptile m_reptile = new Reptile(m_animal);
                        AddReptile(m_reptile);
                        break;
                    }


            }
            UpdateResults();
        }
        private void UpdateResults()
        {

            Resultlst.Items.Clear();  //Erase current list
            //Get one elemnet at a time from manager, and call its 
            //ToString method for info - send to listbox
            for (int index = 0; index < animalmgr.ElementCount; index++)
            {
                Animal animal = animalmgr.GetElementAtPosition(index);

                Resultlst.Items.Add(animal.ToString());
            }
        }

Here is my Animal manager class: 这是我的Animal经理课程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Assign_1
{
    class AnimalManager
    {
        private List<Animal> m_animal;
        private List<Mammal> m_mammal;
        public AnimalManager()
        {
            //In this list objects off diff animals of all species are saved
            m_animal = new List<Animal>();
            m_mammal = new List<Mammal>();
        }


        public void add(Animal ObjIn)
        {
            m_animal.Add(ObjIn);
        }

        public bool IsIndexValid(int index)
        {
            return ((index >= 0) && (index < m_animal.Count));
        }

        public Animal GetElementAtPosition(int index)
        {
            //We choose to return a copy, why do I need type casting when copying?
        if (IsIndexValid(index))
            {
                if (m_animal[index] is Mammal)
                    return new Mammal((Mammal)m_animal[index]);
                if (m_animal[index] is Reptile)
                    return new Reptile((Reptile)m_animal[index]);
                return null;
            }
            else
                return null;
        }

        public int ElementCount
        {
            get { return m_animal.Count; }
        }


    }
}

Here is my mammal class: 这是我的哺乳动物课:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Assign_1
{
    class Mammal : Animal
    {
        private MammalType theMammal;
        private int teeth;


        public Mammal() : base()
             {

             }
        public Mammal(Animal other)
        {
            this.Name = other.Name;
            this.Age = other.Age;
            this.Gender = other.Gender;
            this.Id = other.Id;

        }

        public Mammal (MammalType type)
        {
            theMammal = type; 
        }

#region Props
        public MammalType TheMammal
        {
            get { return theMammal; }
            set { theMammal = value; }
        }


        public int Teeth
        {
            get { return teeth; }
            set { teeth = value; }
         }
#endregion


    }
}

Here is my Dog class: 这是我的Dog课程:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Assign_1
{
    class Dog : Mammal
    {


        public Dog()
        {

        }
      public Dog(Mammal other)
    {
      this.Name = other.Name;
      this.Age = other.Age;
      this.Teeth = other.Teeth;
    }


    }
}

EDIT To do this simpler, I'm only showing child class Mammal and Dog . 编辑为了做到这一点,我只展示了儿童类哺乳动物 If I'm able to figure out how to create a Dog , I can probably fix the others as well. 如果我能弄清楚如何创建一只 ,我也可以修复其他

You need to override the ToString() -method. 您需要覆盖ToString() - 方法。 Note the override keyword in the signature. 请注意签名中的override关键字。

public override string ToString()
{
    //You can put anything here and it will be returned by the ToString()-method.
    return this.Name + ", " + this.Age;
}

Put this code in your Dog -class. 将此代码放入Dog -class中。 It will make dog.ToString() return Name, Age . 它将使dog.ToString()返回Name, Age

Also, you can actually put this override in your base class, Animal, and it will be carried over to all the subclasses. 此外,您实际上可以将此覆盖放在您的基类Animal中,它将被转移到所有子类。 As long as they don't override ToString() themselves they will also return Name, Age . 只要它们不覆盖ToString()本身,它们也将返回Name, Age

You simply need to add an override of the ToString() method in your classes. 您只需要在类中添加ToString()方法的覆盖。
The override returns the value that you choose to display in your ListBoxes. 覆盖返回您选择在ListBoxes中显示的值。

The ListBox, when is ready to display the items, use the ToString method of the class instance that is added to its items collection. ListBox在准备好显示项目时,使用添加到其items集合的类实例的ToString方法。 If there is no ToString() then the base class Object.ToString() is used and that method returns just the class name 如果没有ToString(),则使用基类Object.ToString() ,该方法只返回类名

For example you could change the Dog class with 例如,您可以使用更改Dog类

class Dog : Mammal
{
    public Dog()
    {
    }
    public Dog(Mammal other)
    {
       this.Name = other.Name;
       this.Age = other.Age;
       this.Teeth = other.Teeth;
    } 
    public override string ToString()
    {
       return string.Format("{0}, {1}, {2}", 
               this.Name, this.Age, this.Teeth);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM