列表框显示类名而不是值 [英] Listbox is displaying class name instead of values

查看:25
本文介绍了列表框显示类名而不是值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个项目,其中用户应该输入动物的值(姓名、年龄、性别等),并且用户输入的值应该显示在列表框中这些类相互继承.以下是继承的工作原理:

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 类是所有类的父类.

Mammal 类继承自 Animal 类.

Dog 类继承自 Mammal 类.

Cat 类继承自 Mammal

Reptile 类继承自 Animal

Snake 类继承自 Reptile

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.

例如,如果用户在列表框中选择Mammal,它旁边的列表框将显示DogCat.

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.

问题是当用户在列表框中选择动物类型后输入动物值(名称和年龄)(例如哺乳动物) 并单击添加按钮,尝试添加哺乳动物时结果列表框显示 Assign1_1.Mammal,尝试添加爬行动物时显示 Assign_1.Reptile.

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.

我想要它做的是在结果列表框中显示用户输入的值(姓名和年龄),但它只是说 Assign1.MammalAssign1.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.

这是我的主窗体代码:

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

这是我的动物经理类:

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


    }
}

这是我的哺乳动物课:

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


    }
}

这是我的狗类:

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


    }
}

编辑为了更简单地做到这一点,我只展示了子类 MammalDog.如果我能够弄清楚如何创建Dog,我可能也可以修复其他的.

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.

推荐答案

您只需要在您的类中添加对 ToString() 方法的覆盖.
覆盖返回您选择在列表框中显示的值.

You simply need to add an override of the ToString() method in your classes.
The override returns the value that you choose to display in your ListBoxes.

ListBox 准备好显示项目时,使用添加到其项目集合的类实例的 ToString 方法.如果没有 ToString() 则使用基类 Object.ToString() 并且该方法只返回类名

The ListBox, when is ready to display the items, use the ToString method of the class instance that is added to its items collection. If there is no ToString() then the base class Object.ToString() is used and that method returns just the class name

例如,您可以使用

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

这篇关于列表框显示类名而不是值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆