c# – Listbox显示的是类名而不是值
我正在开发一个用户应该向动物输入值的项目(姓名,年龄,性别等),用户输入的值应显示在列表框中
这些类相互继承.以下是继承的工作原理:
用户可以选择要创建的动物.有一个列表框显示动物的类型(哺乳动物和爬行动物),旁边有一个列表框,根据用户选择的动物类型,它会显示动物. 例如,如果用户在列表框中选择“哺乳动物”,则其旁边的列表框将显示“狗”和“猫”. 这是完美的工作,这不是问题. 问题是,当用户在列表框中选择动物类型(例如Mammal,Dog)后输入动物值(名称和年龄)并单击添加按钮时,结果列表框会在尝试添加哺乳动物时显示Assign1_1.Mammal动物和Assign_1.Reptile在尝试添加爬行动物时. 我想要它做的是在结果列表框中显示用户输入的值(名称和年龄),而只是根据所选动物显示Assign1.Mammal或Assign1.Reptile. 这是我的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()); } } 这是我的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; } } } } 这是我的哺乳动物课: 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 } } 这是我的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; } } } 编辑 解决方法
您只需要在类中添加ToString()方法的覆盖.
覆盖返回您选择在ListBoxes中显示的值. ListBox在准备好显示项目时,使用添加到其items集合的类实例的ToString方法.如果没有ToString(),则使用基类Object.ToString(),该方法只返回类名 例如,您可以使用更改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); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |