如何使用winform listbox在C#中列出声明的对象?
我试图在winform中创建一个列表框,以使用声明对象的列表作为内容源。选择一个对象应该在附近的文本框中列出其属性,该文本框读取该对象的属性。列表的对象如下所示:如何使用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(); } 有人告诉我,把这个放在
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;
}
}