如何使用winform listbox在C#中列出声明的对象?

如何使用winform listbox在C#中列出声明的对象?,c#,class,visual-studio-2012,listbox,C#,Class,Visual Studio 2012,Listbox,我试图在winform中创建一个列表框,以使用声明对象的列表作为内容源。选择一个对象应该在附近的文本框中列出其属性,该文本框读取该对象的属性。列表的对象如下所示: public Form1() { Element gold = new Element(); gold.Property = "Soft"; gold.Metal = true; gold.Name = "Gold"; InitializeComponent(); } 有人告诉我,把这个放在

我试图在winform中创建一个列表框,以使用声明对象的列表作为内容源。选择一个对象应该在附近的文本框中列出其属性,该文本框读取该对象的属性。列表的对象如下所示:

public Form1()
{
    Element gold = new Element();
    gold.Property = "Soft";
    gold.Metal = true;
    gold.Name = "Gold";

    InitializeComponent();
}
有人告诉我,把这个放在我的主要表格中是解决这个问题的方法。到目前为止,我尝试的是给出一个名称字符串,listbox将使用该字符串来命名用户将选择的对象,另外两个属性(gold.Property=“Soft”;和gold.Metal=true;在listbox中选择项目时,将放在附近的文本框中)。我真的不知道该怎么做,所以任何形式的帮助都将不胜感激。在底部,只要知道如何让列表框找到我为它制作的对象,然后列出它,就好了

还有,是的,这是一项任务。因此,我所概述的事情需要以这种方式完成……作业本身还有更多内容,但我陷入困境的地方就在这里。

使用
列出元素
来存储元素, 然后对每个元素进行循环,并将其名称添加到列表框中

将事件处理程序添加到列表框选定索引已更改, 这段代码应该可以做到这一点。(请记住检查所选索引是否为-1)


在不了解您的更多需求的情况下,我只能猜测任务希望您直接将Element()的实例添加到您的列表框中。您可以在Element()类中重写ToString(),以控制ListBox如何显示这些实例。返回Name()属性将非常有效。连接ListBox的SelectedIndexChanged()事件,并将SelectedItem()强制转换回Element(),以便提取其他两个值。这可能看起来像:

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
        listBox1.SelectedIndexChanged += new EventHandler(listBox1_SelectedIndexChanged);

        Element element = new Element();
        element.Property = "Soft";
        element.Metal = true;
        element.Name = "Gold";
        listBox1.Items.Add(element);

        element = new Element();
        element.Property = "Indestructible";
        element.Metal = true;
        element.Name = "Adamantium";
        listBox1.Items.Add(element);

        element = new Element();
        element.Property = "Liquid";
        element.Metal = true;
        element.Name = "Mercury";
        listBox1.Items.Add(element);

        element = new Element();
        element.Property = "Fluffy";
        element.Metal = false;
        element.Name = "Kitten";
        listBox1.Items.Add(element);
    }

    void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listBox1.SelectedIndex != -1)
        {
            Element element = (Element)listBox1.SelectedItem;
            label1.Text = "Property: " + element.Property;
            label2.Text = "Metal: " + element.Metal.ToString();
        }
    }
}

public class Element
{
    public string Property;
    public bool Metal;
    public string Name;

    public override string ToString()
    {
        return Name;
    }
}

这是非常有用的,并且在添加新项目方面给了我很多需要理解和处理的东西。然而,当我第一次添加“元素”(“gold”)时,它给出了列表中的整行代码。所以,我做了listbox1.Items.Add(element.Name);这就给了我这个名字。不过,你给我的对我现在所做的很有好处。非常感谢!如果可以的话,我会投这个票。如果你回答了我的问题,我会在我实施后通知你。再次感谢。请注意我是如何在示例底部的Element()类中重写ToString()的。这就是控制ListBox如何显示实例的原因。如果不这样做,它只会显示类的完全限定名,这并没有多大帮助。我将其设置为返回Name()属性。如果改为将
element.Name
添加到列表框中,则会丢失其他关联的数据段,因为所添加的只是一个普通的旧字符串。您必须使用
listBox1.Items.Add(element)
,以便所有数据都在列表框中(即使您只看到其中显示的名称)。
public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
        listBox1.SelectedIndexChanged += new EventHandler(listBox1_SelectedIndexChanged);

        Element element = new Element();
        element.Property = "Soft";
        element.Metal = true;
        element.Name = "Gold";
        listBox1.Items.Add(element);

        element = new Element();
        element.Property = "Indestructible";
        element.Metal = true;
        element.Name = "Adamantium";
        listBox1.Items.Add(element);

        element = new Element();
        element.Property = "Liquid";
        element.Metal = true;
        element.Name = "Mercury";
        listBox1.Items.Add(element);

        element = new Element();
        element.Property = "Fluffy";
        element.Metal = false;
        element.Name = "Kitten";
        listBox1.Items.Add(element);
    }

    void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (listBox1.SelectedIndex != -1)
        {
            Element element = (Element)listBox1.SelectedItem;
            label1.Text = "Property: " + element.Property;
            label2.Text = "Metal: " + element.Metal.ToString();
        }
    }
}

public class Element
{
    public string Property;
    public bool Metal;
    public string Name;

    public override string ToString()
    {
        return Name;
    }
}