【问题标题】:How to use winform listbox to list declared objects in C#?如何使用 winform 列表框列出 C# 中声明的对象?
【发布时间】:2013-05-13 02:12:05
【问题描述】:

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

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

    InitializeComponent();
}

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

另外,是的,这是一个作业。所以我所概述的事情需要以这种方式完成......任务本身还有更多内容,但我被困在这里。

【问题讨论】:

    标签: c# class visual-studio-2012 listbox


    【解决方案1】:

    使用List<Element> elements 存储您的元素, 然后对每个元素进行循环并将其名称添加到列表框。

    将事件处理程序添加到您的列表框选择的索引已更改, 这段代码应该这样做。 (记得检查选择的索引是否为-1)

    txtName.Text = elements[listbox.SelectedIndex].Name;
    txtProperty.Text = elements[listbox.SelectedIndex].Property;
    

    【讨论】:

      【解决方案2】:

      在不了解您的更多需求的情况下,我只能猜测任务希望您直接将 Element() 的实例添加到您的 ListBox。您可以在 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;
          }
      }
      

      【讨论】:

      • 这非常有用,在添加新项目方面给了我很多理解和工作。然而,当我第一次添加“元素”(“黄金”)时,它给了我列表中的整行代码。所以,我做了 listbox1.Items.Add(element.Name);这给了我这个名字。不过,你给我的东西对我正在做的事情确实有好处。非常感谢!如果可以的话,我会赞成这个。如果您回答了我的问题,我会在实施后通知您。再次感谢。
      • 请注意我是如何在示例的 底部 的 Element() 类中覆盖 ToString() 的。这是控制 ListBox 如何显示您的实例的内容。没有它,它只会显示你的类的完全限定名称,这不是很有帮助。我将其设置为返回 Name() 属性。如果您改为将 element.Name 添加到 ListBox,那么您将 丢失 其他相关的数据,因为您添加的只是一个普通的旧字符串。您必须使用 listBox1.Items.Add(element) 以便所有数据都在 ListBox 中(即使您只看到名称显示在那里)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 2023-03-31
      • 1970-01-01
      • 2011-10-09
      相关资源
      最近更新 更多