2017-05-06 140 views
1

所以我有一个类叫做Person。每个人可以有一个Name,AgeEmail。我有大约50个Person对象存储在名为PersonList的列表中。我这样定义的:listBox填充对象

List<Person> PersonList = new List<Person>(); 

的阵列看起来是这样的:我再通过这个

PersonList = { 
    { 
     name: 'John', 
     age: 30, 
     email: '[email protected]' 
    }, 
    { 
     name: 'Bill', 
     age: 55, 
     email: '[email protected]' 
    } 
} 

循环和增加他们的每一个Name到一个列表框:

foreach (var Person in PersonList) 
{ 
    ListBox.Items.Add(Person.Name); 
} 

请注意:所有名字都是独一无二的。

我现在想做的事情是,当我在列表框中选择一个名字时,我希望他们的姓名,年龄和电子邮件显示在名为Label1的标签中。目前,我通过循环PersonList并检查与选定的ListBox项目文本匹配的名称来实现此目的。

private void ListBox_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    foreach (var Person in PersonList) 
    { 
     if (Person.Name == ListBox.SelectedItem.ToString()) 
     { 
      Label1.Text = "Name: " + Person.Name + Environment.NewLine + 
          "Age: " + Person.Age + Environment.NewLine + 
          "Email: " + Person.Email; 
     } 
    } 
} 

它的工作,但这是做到这一点的正确方法?我觉得不断循环PersonList来比较名称可能会对性能造成影响。如果PersonList包含数千个对象,该怎么办?

我也想知道是否有更好的方法将所有Person.Name插入到ListBox中?还是循环的路要走?我知道AddRange,但是我可以在Person.Name上做些什么? 注意:我只想将它们的名称添加到列表框中。

你会做什么?

+0

这是更好地使用数据绑定。看看[这个例子](http://stackoverflow.com/a/43699718/3110834)。同样使用'BindingList '会比'List '更好。 –

+0

不太正确的方法。 - 为您的课堂添加ToString覆盖。然后你可以自己添加实例,而不仅仅是名称。你可以将选中的对象转换回Person。 – TaW

+0

你使用的是Windows Forms还是WPF? – Fruchtzwerg

回答

2

您可以用列表直接填写列表框,而该项目的选择可以有3种方式来实现,见代码:

public class Pessoa 
    { 
     public string Nome { get; set; } 
     public string Email { get; set; } 

     public override string ToString() 
     { 
      return this.Nome.ToString(); 
     } 

    } 
    List<Pessoa> lista = new List<Pessoa>(); 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     lista.Add(new Pessoa() { Nome = "Rovann1", Email = "[email protected]" }); 
     lista.Add(new Pessoa() { Nome = "Rovann2", Email = "[email protected]" });   
     lista.Add(new Pessoa() { Nome = "Rovann3", Email = "[email protected]" }); 

     listBox1.DisplayMember = "Nome"; 
     listBox1.DataSource = lista; 


    } 

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     label1.Text = "Select one item"; 


     //1 

     if (listBox1.SelectedItem != null) 
     { 
      label1.Text = ((Pessoa)listBox1.SelectedItem).Email; 
     } 

     //2 

     Pessoa p = lista.Find(x => x.Nome == listBox1.SelectedItem.ToString()); 
     if (p != null) 
      label1.Text = p.Email; 


     //3 

     if (listBox1.SelectedIndex >= 0) 
      label1.Text = lista[listBox1.SelectedIndex].Email; 

    } 
+0

哇!真的很好的做法!我没有想到它。这么多种方式来填充标签,哈哈。我也不知道.DisplayMember和.DataSource。这真的很干净!谢谢! –

+0

欢迎您 –

+0

您认为哪种方式最适合标签文字的表现?他们之间有很多不同之处吗? –