【问题标题】:ListBox doesn't show collection of objects in C#ListBox 不显示 C# 中的对象集合
【发布时间】:2017-06-26 11:15:33
【问题描述】:

已编辑!工作代码

我有以下课程:

class Medic
{
    private readonly int codM;
    private string numeM;
    private string specialitate;

    //i have a constructor and properties with get and set, correctly written
}

我在要填写的表单中添加了 3 个文本框,每个文本框都与一个类属性相关。

在此之后我有一个按钮,如果所有 3 个文本框字段都正确完成,则会创建一个新的类对象。

这个对象将被添加到一个列表中。我希望将这个对象列表显示在一个列表框中,并在我添加新对象时进行更新。

另外,我希望列表中已有 2 个对象,并在我运行程序时显示在列表框中,这些对象是在我的意思是代码中创建的,而不是使用文本框,并且新输入的对象将出现在这些对象之后。我几乎不知道在哪里编写代码来创建这 2 个对象,就像在哪里可以创建和填充对象列表或编写代码以将此列表绑定到 ListBox;

public partial class Form1 : Form
    {

        List<Medic> listaMedici = new List<Medic>();
        Medic m1 = new Medic(0, "ion", "endocrinologie");

        public Form1()
        {
            InitializeComponent();

            listaMedici.Add(m1);


        }
private void button1_AddObject_Click(object sender, EventArgs e)
{
    if (textBox1_cod.Text == "")
        errorProvider1.SetError(textBox1_cod, "Introduceti codul medicului!");
    else if (textBox2_nume.Text == "")
        errorProvider1.SetError(textBox2_nume, "Introduceti numele medicului");
    else if (Regex.IsMatch(textBox2_nume.Text, @"^[ a-zA-Z]+$") == false)
        errorProvider1.SetError(textBox2_nume, "Numele contine doar litere si spatii");
    else if (textBox3_specialitate.Text == "")
        errorProvider1.SetError(textBox3_specialitate, "Introduceti specialitatea medicului");
    else
    {
        try
        {
            Medic medic = new Medic(Convert.ToInt32(textBox1_cod.Text), textBox2_nume.Text, textBox3_specialitate.Text);

            foreach (Medic m in listaMedici)
            {
                if (textBox1_cod.Text == m.CodM.ToString())
                {
                    throw new Exception("Codul contractului incalca proprietatea de unicitate. Introduceti un cod unic");
                    textBox1_cod.Clear();
                }
            }
                listaMedici.Add(medic);
                listBox1_medici.DataSource = new ObservableCollection<Medic>(listaMedici);
                listBox1_medici.DisplayMember = nameof(Medic.NumeM);
                listBox1_medici.ValueMember = nameof(Medic.CodM);
                listBox1_medici.SelectedIndex = 0;


            MessageBox.Show("ADDED!");

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            errorProvider1.Clear();
            textBox1_cod.Clear();
            textBox2_nume.Clear();
            textBox3_specialitate.Clear();
        }
    }

}

private void listBox1_medici_SelectedIndexChanged(object sender, EventArgs e)
{
}

【问题讨论】:

  • 显示成员应该是要显示的属性的名称,而不是字符串属性。在您的情况下,它应该是“NumeM”
  • 也可以考虑使用ObjectListView。 objectlistview.sourceforge.net/cs/index.html
  • 查看CollectionViewSource 并使用ItemsSource 而不是DataSource
  • listBox1_medici.DataSource = ... 表示它是 WinForms 列表框,而不是 WPF。你到底在问什么?

标签: c# .net winforms listbox


【解决方案1】:

显示成员应该是要显示的属性的名称,而不是字符串属性。反射用于查找显示成员名称的属性。例如,如果您的medic.NumeM 值为“Hello”,WPF 将查找名为“Hello”的属性,检索该属性的值并将其显示在列表框中。

在您的情况下,代码应为:listBox1_medici.DisplayMember = "NumeM";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2014-12-29
    • 2010-12-09
    • 1970-01-01
    相关资源
    最近更新 更多